C++指针赋值出现非预期结果,last变量取值与预期不符问题
问题根源
你的代码问题出在悬空指针访问+栈内存复用,属于C++未定义行为的一种:
- 你在
for循环中每次定义的局部变量arg的作用域仅局限于单次迭代,单次迭代结束后该变量的内存就会被编译器回收,你保存在snap中的指针就变成了悬空指针,访问*snap的行为本身是不被C++标准保障的。 - 实际运行时,编译器大概率会把每次迭代的
arg分配在栈的同一个内存地址上,所以下一轮迭代给arg赋值为当前i的时候,会直接覆盖掉snap指向的地址的内容。这时候你执行last = *snap读取的其实已经是被改写后的当前迭代的arg值,自然和后续的*snap取值完全一致。
修复方案
直接修改snap的类型为int,存储上一轮的值而非指针,避免悬空指针问题即可:
#include <iostream> using namespace std; int snap = -1; int last = -1; void func(int md){ last = snap; snap = md; cout << last << " " << snap << endl; } int main() { for(int i =0;i<10;i++) { int arg = i; func(arg); } return 0; }
运行后就能得到你预期的输出:
-1 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9
内容的提问来源于stack exchange,提问作者sanity_overflow
相关产品推荐
相关产品推荐

