C语言执行指针算术操作后输出类地址数值的原因是什么?
C语言指针自增后输出异常的原因分析
问题复现代码
#include<stdio.h> int main(){ int i=30; int *ptr=&i; printf("Value of i is %d\n",*ptr); ptr++; printf("Value of i is %d\n",*ptr); return 0; }
具体原因说明
- 初始状态下
int*类型的指针ptr指向局部变量i的内存地址,第一次解引用*ptr读取的就是i存储的值30,输出结果正常。 - C语言的指针算术会按照指针指向的类型长度计算偏移量:
int类型在常规64位/32位系统中占4字节,执行ptr++操作后,指针会向后偏移4字节,指向i变量占用内存之后的相邻地址。 - 这个偏移后的地址不属于程序合法声明的可读写变量空间,也没有被初始化赋值,对其解引用属于未定义行为,读取到的是内存中遗留的随机垃圾值,所以第二次输出的是无实际意义的随机数,也就是你看到的6618648这类异常数值。
- 这类非法内存访问操作存在很高风险,除了读取到无效值外,严重时会直接触发段错误导致程序崩溃,实际开发中要严格避免。
内容的提问来源于stack exchange,提问作者Nirbhay Thakkar
相关产品推荐
相关产品推荐

