NULL указатели не могут быть разыменованы.
Это вызывает неопределенное поведение , что в данном случае проявляется в аварийном завершении вашей программы.
Это описано в разделе 6.5.3.2p4 стандарта C:
4 Унарный оператор *
обозначает косвенность.Если операнд указывает на функцию, результатом является обозначение функции;если он указывает на объект, результатом является lvalue, обозначающее объект.Если операнд имеет тип «указатель на тип», результат имеет тип «тип». Если указателю присвоено недопустимое значение, поведение унарного оператора * не определено. 102)
102) Таким образом, &*E
эквивалентно E
(даже если E является нулевым указателем) и &(E1[E2])
до ((E1)+(E2))
.Всегда верно, что если E
является обозначением функции или lvalue, который является допустимым операндом унарного оператора &
, *&E
является обозначением функции или lvalue, равным E
.Если *P
- это lvalue, а T
- это имя типа указателя объекта, *(T)P
- это lvalue, тип которого совместим с типом, на который указывает T
.
Среди недопустимых значений для разыменования указателя унарным оператором *
есть нулевой указатель , адрес, неправильно выровненный для типа объекта, на который указывает объект, и адрес объектапосле окончания срока его службы.
Если вы хотите напечатать сам указатель, передайте его в printf
без разыменования и используйте спецификатор формата %p
:
printf("%p\n", (void *)p);