#include <stdio.h>
int main() {
char c = 'A';
int *int_ptr;
double *double_ptr;
*int_ptr = *(int *)&c;
*double_ptr = *(double *)&c;
printf("Original char = %c \n", c);
printf("Integer pointer = %d \n", *int_ptr);
printf("Double pointer = %f\n", *double_ptr);
return 0;
}
квестинга - почему я не могу назначить double_ptr
с помощью этого кода, поскольку он вызывает ошибку сегментации, но работает отлично подходит для целого?Cast типа указателя в C
Как я понимаю, char имеет длину 1 байт, а int - 4 байта, поэтому double имеет длину 8 байтов.
Используя выражение *(double *)&c
Я ожидаю следующее:
- & - Получить адрес памяти с.
- (double *) - притворитесь, что это указатель на двойной.
- *() - получить фактическое значение и присвоить его двойному var.
1) Вы знаете, что вы делаете, это «неправильно». 2) Если вам интересно, почему вы получаете ошибку сегментации, почему бы вам не скомпилировать с -S (gcc) или/Fa (MSVC) и посмотреть на сборку? – paulsm4
Прежде всего, у вас нет памяти за указателями, поэтому '* int_ptr' адресует память, которая не принадлежит вам, то есть UB. Вы даже не знаете, где, поскольку указатель не инициализирован. Кроме того, вы пытаетесь прочитать символ (1 байт), используя int (4 или 8 байт), который снова является UB. – 4386427