#include <stdio.h>
void main ()
{
int* p = NULL;
printf("%d", *p);
}
它打印:
Exception thrown: read access violation.
p was nullptr.
答案 0 :(得分:7)
NULL指针不能被取消引用。
这样做会调用undefined behavior,在这种情况下,这会导致程序崩溃。
C standard的6.5.3.2p4部分对此进行了记录:
4 一元
*
运算符表示间接。如果操作数指向一个函数,则结果为一个函数指示符;否则为0。如果它指向一个 对象,结果是一个左值指定对象。如果 操作数的类型为“要键入的指针”,结果为 输入“类型”。 如果已将无效值分配给 指针,一元的行为 *运算符未定义。 102)102)因此,
&*E
等效于E
(即使E是空指针),并且&(E1[E2])
至((E1)+(E2))
。如果E
是 函数指定符或为以下内容的有效操作数的左值 一元&
运算符,*&E
是一个函数指示符或一个等于E
的左值。如果*P
是左值,T
是对象指针类型的名称,*(T)P
是一个左值,其类型与T
所指向的类型兼容。在用于取消引用指针的无效值中 由一元
*
运算符是空指针,其地址与所指向对象的类型不适当地对齐,并且其后的对象的地址 生命的尽头。
如果您要打印指针本身,请将其传递给printf
而不取消引用,并使用%p
格式说明符:
printf("%p\n", (void *)p);
答案 1 :(得分:3)
int* p = NULL; *p;
的行为是未定义。
如果要打印出p
的地址,请使用"%p"
作为格式说明符,并删除取消引用:
printf("%p", (void*)p);
为了完全匹配格式说明符,必须强制转换为(void*)
。