C++对指针传引用后解引用出现随机值的原因是什么?
问题原因解答
你遇到的是典型的**悬垂指针(野指针)**导致的未定义行为,具体原因如下:
- 函数
myMethod中定义的t是局部自动变量,存储在程序的栈内存中,它的生命周期仅局限于myMethod的运行阶段:一旦myMethod执行结束退出,对应的栈帧会被系统回收销毁,t占用的内存空间会被标记为空闲可复用,原有存储的数值不再受保护。 - 你在函数内部将
t的地址赋值给了外部传入的指针引用x,相当于直接修改了main函数中py的指向,让它指向了即将被释放的栈内存地址。 - 当回到
main函数再次解引用py时,原来t对应的内存可能已经被其他栈操作覆盖写入了新的内容,因此读取到的是不确定的随机值,这种操作本身属于C++标准规定的未定义行为,极端情况下还会直接导致程序崩溃。
如果要实现预期的输出,可选择以下修正方案:
- 把
t声明为静态局部变量:static int t = 4;,静态变量的生命周期会持续到程序结束,不会随函数退出销毁。 - 改用堆内存存储目标值:
int* pt = new int(4;,堆内存需要手动delete释放,不会随函数退出自动回收。 - 避免将局部变量的地址传出函数,改为修改指针指向的地址存储的值,而非修改指针本身的指向。
内容的提问来源于stack exchange,提问作者jackmiller
相关产品推荐
相关产品推荐

