【问题标题】:C++ Pointers assignment gives unexpected(?) resultsC++ 指针赋值给出了意想不到的(?)结果
【发布时间】:2021-11-06 15:10:24
【问题描述】:
int* snap = nullptr;
int last = -1;   
void func(int* md){
        if(snap!=nullptr) {
            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
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8

'last' 变量不应该具有上一次迭代的'snap' 值。但值是相等的。我在这里做错了什么?

【问题讨论】:

  • "上一次迭代的 'snap' 值。" -- 在当前迭代过程中,这个值(不是值的地址,而是值本身)到底存储在哪里迭代?
  • 感谢您的帮助。我现在已经意识到我的错误了。我让给定指针指向的值更改而不存储正在更改的值

标签: c++ c++11 pointers


【解决方案1】:

在 for 循环的第二次迭代中,snap 指向一个悬空指针。它指向的int arg 已超出范围。

虽然它是一个悬空指针,但您取消引用它,导致未定义的行为。

【讨论】:

  • 我已将 arg 变量设为全局变量。结果似乎没有改变
  • @sanity_overflow 如果将其设为全局,snap&amp;arg 相同,因此*snaparg 是相同的对象。也就是说,您的代码相当于分配last = arg;,然后打印lastarg
猜你喜欢
  • 2019-05-19
  • 2017-01-05
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 2021-04-22
  • 2016-02-13
相关资源
最近更新 更多