我写了这段代码:
#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?
正如预期的那样,我收到了输出:[...]
您没有任何特定期望的有效理由,因为您的程序具有未定义的行为。
这里:
{ int y = 9; u = &y; }
u
被分配一个变量的地址,该变量的生命周期在 { ... }
复合语句的执行终止时结束。此时,存储在 u
中的值变得不确定。因为您稍后读取了 u
的(不确定)值,所以(整个程序的整个执行的)行为是未定义的。
不同的程序(也具有未定义的行为)产生不同的输出并不重要,无论程序的源有多密切相关。