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

时间:2019-03-12 14:30:59

标签: c pointers

#include <stdio.h>
void main ()
{
    int* p = NULL;
    printf("%d", *p);
}

它打印:

Exception thrown: read access violation.
p was nullptr.

2 个答案:

答案 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*)