Указатели на неинициализированную память будут вызывать ошибку. По умолчанию такой указатель представляет собой неверный адрес.
int *pi;
printf("%i\n",*pi);
Приведенный выше код приводит к использованию неинициализированной переменной Error.
error: ‘pi’ is used uninitialized in this function
Однако при первой печати адреса кажется, что указатель инициализирован действительным адресом, но заполнен неверными данными.
int *pi;
printf("%p\n",&pi); //address printing
printf("%i\n",*pi);
который распечатывает:
0x7ffeea9313c8 //valid virtual address
-125990072 //invalid data
Вопрос:
Есть ли адрес оператора (&) инициализировать указатель? Если нет, пожалуйста, исправьте неправильное понимание.
Поскольку вы передаете адрес этого указателя в функцию, компилятор больше не может сказать, был ли он инициализирован внутри этой функции.
Рассмотрим следующую функцию:
void init_ptr(int **ptr) { *ptr = some_valid_addr; }
Тогда вы звоните:
int *pi;
init_ptr(&pi);
Ты знаешь printf()
не будет инициализировать указатель, но у компилятора недостаточно информации, чтобы определить разницу.
Других решений пока нет …