Адрес оператора может инициализировать указатель, но значение заполнения является мусором

Указатели на неинициализированную память будут вызывать ошибку. По умолчанию такой указатель представляет собой неверный адрес.

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

Вопрос:

Есть ли адрес оператора (&) инициализировать указатель? Если нет, пожалуйста, исправьте неправильное понимание.

0

Решение

Поскольку вы передаете адрес этого указателя в функцию, компилятор больше не может сказать, был ли он инициализирован внутри этой функции.

Рассмотрим следующую функцию:

void init_ptr(int **ptr) { *ptr = some_valid_addr; }

Тогда вы звоните:

int *pi;
init_ptr(&pi);

Ты знаешь printf() не будет инициализировать указатель, но у компилятора недостаточно информации, чтобы определить разницу.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]