繁体   English   中英

为什么在尝试打印空指针时出现get错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM