You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 03:42:02