C++ 中意外的指针行为:为什么当另一个指针赋值被注释掉时,变量会指向局部变量的值?

问题描述 投票:0回答:1

我写了这段代码:

#include <iostream>


int main()
{
    int x = 0;
    int *u, *k;
    
    {   
        int y = 9;
        u = &y;
    }
    
    int z = 11;
    k = &z;
    
    std::cout << "u = " << u << std::endl;
    std::cout << "k = " << k << std::endl;
    std::cout << "*u = " << *u << std::endl;
    std::cout << "*k = " << *k;

    return 0;
}

正如预期的那样,我收到了输出:

u = 0x7fff039b1440
k = 0x7fff039b1440
*u = 11
*k = 11

但是通过注释掉

//k = &z;
行,输出变成这样:

u = 0x7ffebca2bc1c
k = 0
*u = 9

如果变量 z 应该位于这个地址,为什么 u 指向值 9?

c++ pointers
1个回答
0
投票

正如预期的那样,我收到了输出:[...]

您没有任何特定期望的有效理由,因为您的程序具有未定义的行为。

这里:

    {   
        int y = 9;
        u = &y;
    }

u
被分配一个变量的地址,该变量的生命周期在
{ ... }
复合语句的执行终止时结束。此时,存储在
u
中的值变得不确定。因为您稍后读取了
u
的(不确定)值,所以(整个程序的整个执行的)行为是未定义的。

不同的程序(也具有未定义的行为)产生不同的输出并不重要,无论程序的源有多密切相关。

© www.soinside.com 2019 - 2024. All rights reserved.