[英]Why do I an get error when trying to print a null pointer
#include <stdio.h>
void main ()
{
int* p = NULL;
printf("%d", *p);
}
它打印:
Exception thrown: read access violation.
p was nullptr.
空指针可能无法解除引用。
这样做会调用未定义的行为 ,在这种情况下会出现在程序崩溃中。
这在C标准的 6.5.3.2p4节中记录:
4一元
*
运算符表示间接。 如果操作数指向函数,则结果是函数指示符; 如果它指向一个对象,则结果是指定该对象的左值。 如果操作数的类型为“指向类型的指针”,则结果的类型为“type”。 如果为指针分配了无效值,则unary *运算符的行为未定义。 102)102)因此,
&*E
等效于E
(即使E是空指针),和&(E1[E2])
等于((E1)+(E2))
。 如果E
是函数指示符或左值是一元&
运算符的有效操作数,则总是如此,*&E
是函数指示符或等于E
的左值。 如果*P
是左值并且T
是对象指针类型的名称,则*(T)P
是具有与T
指向的类型兼容的类型的左值。在由一元
*
运算符解除引用指针的无效值中,有一个空指针 ,一个与指向的对象类型不适当对齐的地址,以及一个对象在其生命周期结束后的地址。
如果要打印指针本身,将其传递给printf
而不取消引用它并使用%p
格式说明符:
printf("%p\n", (void *)p);
int* p = NULL; *p;
的行为int* p = NULL; *p;
int* p = NULL; *p;
未定义 。
如果要打印出p
的地址 ,请使用"%p"
作为格式说明符,然后删除取消引用:
printf("%p", (void*)p);
为了与格式说明符完全匹配,需要转换为(void*)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.