C++ 指针赋值给出了意想不到的(?)结果

Posted

技术标签:

【中文标题】C++ 指针赋值给出了意想不到的(?)结果【英文标题】:C++ Pointers assignment gives unexpected(?) results 【发布时间】: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' 值。" -- 在当前迭代过程中,这个值(不是值的地址,而是值本身)到底存储在哪里迭代? 感谢您的帮助。我现在已经意识到我的错误了。我让给定指针指向的值更改而不存储正在更改的值 【参考方案1】:

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

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

【讨论】:

我已将 arg 变量设为全局变量。结果似乎没有改变 @sanity_overflow 如果将其设为全局,snap&amp;arg 相同,因此*snaparg 是相同的对象。也就是说,您的代码相当于分配last = arg;,然后打印lastarg

以上是关于C++ 指针赋值给出了意想不到的(?)结果的主要内容,如果未能解决你的问题,请参考以下文章

关于c++指针赋值的问题

C++ 指针取消引用赋值

如何通过JNI将java中的对象的地址赋值给c++指针变量

为指针向量赋值

C++之拷贝构造与拷贝赋值

C语言 将整型变量赋值为空