Я новичок в этом конкретном форуме, поэтому, если есть какие-либо вопиющие варианты форматирования, пожалуйста, дайте мне знать, и я незамедлительно обновлю.
В книге C Programming: A Modern Approach (автор - KN King) написан следующий отрывок:
Если переменная-указатель p
не был инициализирован, попытка использовать значение p
каким-либо образом вызывает неопределенное поведение . В следующем примере вызов printf
может печатать мусор, заставлять программу cra sh или иметь другой эффект :
int *p;
printf("%d", *p);
Насколько я понимаю указатели и то, как компилятор обрабатывает их, объявление int *p
фактически говорит: «Эй, если вы разыменуете p
в будущем, я посмотрю на блок из четырех последовательных байтов в памяти, чей начальный адрес является значением, содержащимся в p
, и интерпретировать эти 4 байта как целое число со знаком. "
Что касается того, правильно это или нет ... если это правильно , тогда меня немного смущает, почему вышеупомянутый блок кода:
- классифицируется как неопределенное поведение
- может привести к тому, что программы будут взламывать sh
- может иметь другой эффект
Комментарии к случаям, пронумерованным выше:
Насколько я понимаю, неопределенное поведение заключается в том, что при запуске время, всякое бывает . С учетом сказанного, в приведенном выше коде мне кажется, что может произойти только очень определенное подмножество вещей. Я понимаю, что p
(из-за отсутствия инициализации) хранит случайный адрес, который может указывать где угодно в памяти. Однако, когда printf
передается разыменованное значение *p
, не будет ли компилятор просто смотреть на 4 последовательных байта памяти (которые начинаются с любого случайного адреса) и интерпретировать эти 4 байта как целое число со знаком?
Следовательно, printf
должен делать только одно: выводить число в диапазоне от -2 147 483 648 до 2 147 483 647. Ясно, что это различных возможных выходов, но действительно ли это квалифицируется как «неопределенное поведение». Кроме того, как такое «неопределенное поведение» могло привести к «program cra sh» или «иметь какой-то другой эффект».
Любые разъяснения были бы очень признательны! Спасибо!