C语言int指针p自增后解引用*p输出异常原因求解
你遇到的*p输出异常值的问题本质是非法内存访问触发的C语言未定义行为,具体原因如下:
- 你只给
int a申请了1个int长度的栈内存,初始状态下指针p合法指向这块内存,所以第一次访问*p能正确拿到a的值3。 - 执行
p = p + 1时,int类型指针会按其指向的类型长度做偏移:32位int占4字节,所以地址值加4和你的观察完全一致。但偏移后的p指向的是a变量相邻的内存区域,这块内存你没有申请过,也没有做过赋值操作,里面存储的是程序运行过程中残留的随机垃圾值。 - 额外需要注意的代码问题:你打印指针地址时用的
%d格式符是错误的,打印内存地址应该使用%p格式符,该写法本身也属于未定义行为,只是在你的运行环境中没有触发崩溃而已。
访问未被程序合法申请的内存是C标准明确规定的未定义行为,运行结果完全不确定:可能输出随机垃圾值、可能直接触发段错误崩溃,也可能在某些环境下看似输出正常值,完全取决于运行时对应内存地址上刚好存储的内容。
内容的提问来源于stack exchange,提问作者Leveling_up
相关产品推荐
相关产品推荐

