p
равно NULL
, что является недопустимым значением указателя - по этому адресу нет объектов. Выражение *p
в вызове printf
пытается разыменовать этот недопустимый указатель, и при этом поведение undefined . В этом конкретном случае это приводит к сбою вашего кода.
Помните, что декларация
int * p = 0;
создает объект типа «указатель на int
» (*
только для обозначения типа) и инициализирует значение этого объекта указателя 0
(NULL
). По определению , p
не указывает ни на какой объект или функцию, поэтому выражение *p
не имеет смысла.
Не говоря уже о том, что выражение *p
имеет тип int
, поэтому для его печати вы должны использовать %d
, а не %p
.
Примечание - есть нулевой указатель константа и нулевой указатель значение . Константа с нулевым значением в контексте указателя (например, 0
или (void*) 0
) является нулевым указателем constant (макрос NULL
). Во время перевода этот нулевой указатель константа преобразуется в нулевой указатель значение , которое может быть или не быть 0
. Значение нулевого указателя - это просто какое-то четко определенное значение адреса, которое гарантированно будет отличаться от адреса любого объекта или функции.