关于C指针基础的疑问:p=NULL与*p=NULL执行结果差异咨询
关于指针赋值
p = NULL与*p = NULL的输出差异解析 嘿,这个问题抓得特别准,刚好是指针操作里最容易踩坑的点之一!我来给你把底层逻辑掰明白:
1. p = NULL:修改的是指针本身的指向
当你执行p = NULL时,你是把指针变量p自己的值设置成了NULL(在绝大多数系统里,NULL等价于地址0)。这时候p不再指向原来的目标对象了,变成了一个空指针。
如果这时候你试图访问*p(也就是空指针指向的内存),这属于C/C++标准里的未定义行为——标准没有规定这种操作的结果是什么,可能返回某个随机的垃圾值,可能直接触发程序崩溃,甚至在不同编译器/系统下表现完全不一样,所以你得到的是“不确定值”。
2. *p = NULL:修改的是指针指向的对象内容
而*p = NULL操作的是p当前指向的内存地址里的数据。这里的NULL本质是一个值为0的宏定义,所以这句话等价于把p指向的变量赋值为0。
只要p原本指向的是一块有效的内存(比如之前已经正确初始化指向了某个变量),那这个操作就是合法的,之后读取这个变量的值自然会得到0,所以程序输出0完全符合预期。
举个直观的例子帮你理解:
int x = 10; int *p = &x; // p指向x的地址 p = NULL; // 现在p不再指向x,变成空指针 printf("%d", *p); // 未定义行为,输出不确定值 // 重新初始化p p = &x; *p = NULL; // 等价于x = 0 printf("%d", x); // 输出0,完全正常
总结一下:
p = NULL:改变指针的指向,让它变成空指针,后续访问*p是非法操作*p = NULL:修改指针指向的对象的值,只要指针本身有效,这个操作就是安全的
内容的提问来源于stack exchange,提问作者Kevin Kuo
相关产品推荐
相关产品推荐

