Раньше я думал, что неинициализированный указатель принимает Null
значение после его объявления. Я не прав?
Да , ваше предположение неверно. Неинициализированный указатель , объявленный с помощью автоматического хранения , всегда содержит данные мусора или ненужные данные, т. Е. Недопустимый адрес, поэтому лучше сначала инициализировать с помощью NULL
при объявлении. Например,
double *d = NULL;
/* some processing */
if(d == NULL) {
/* @TODO error handling. Not allowed to de-reference NULL pointer */
}
Здесь
double d[25];
printf("d : %x\t",d);
d
- это массив 25
двойного & имени самого массива с адресом , в то время как печать d
с использованием %x
вызывает неопределенное поведение , даже ваш компилятор может иметь предупредил вас, как это
main.c: 5: 19: предупреждение: формат указывает тип 'unsigned int', но
аргумент имеет тип 'double *' [-Wformat]
Но вы, похоже, игнорируете предупреждения компилятора, не следует. Всегда компилируйте ваш код с минимальными флагами, такими как -Wall
. Например, 1037 *
gcc -Wall -Werror -Wpedantic test.c
Чтобы напечатать имя массива, используйте спецификатор формата %p
. например,
double d[25];
printf("Array d : %p\t",(void*)d);
Аналогично указателю int
, указателю t
и char
, указателю c
, используйте спецификатор формата %p
вместо %x
. Также не держите в коде неинициализированный указатель.
int * t; /* initialized with valid address else
dereferencing uninitialized pointer causes UB */
printf("t : %p\n",(void*)t);