为什么我不能打印值为 NULL 的指针? 这是我的代码:
#include <stdio.h>
int main(void)
{
int * p = 0;
printf("%p %p ", p, *p);
getchar();
return 0;
}
错误为:"引发异常:读取访问冲突。 P是空的。 我想了解错误...
p
是NULL
,这是一个无效的指针值 - 该地址没有对象。printf
调用中*p
的表达式尝试取消引用该无效指针,并且执行此操作的行为是未定义的。 在这种特殊情况下,它会导致代码崩溃。
请记住,声明
int * p = 0;
创建一个类型为"指向int
的指针"的对象(*
仅用于指示类型),并将该指针对象的值初始化为0
(NULL
)。根据定义,p
不指向任何对象或函数,因此表达式*p
没有意义。
更不用说,表达式*p
的类型是int
,所以你会使用%d
来打印它,而不是%p
。
注意 - 有一个空指针常量和一个空指针值。 指针上下文中的零值常量表达式(如0
或(void*) 0
)是空指针常量(NULL
宏)。 在转换过程中,该空指针常量将转换为空指针值,该值可能0
也可能不。 null 指针值只是一些定义良好的地址值,保证与任何对象或函数的地址不相等。
指针指向变量。试试这个:
#include <stdio.h>
int main(void)
{
int a = 0;
int * p = &a;
printf("%p %p ", p, *p);
getchar();
return 0;
}