为什么运行得很好?(范围外变量的访问地址)

Why does this run fine ? (accessing address of an out-of-scope variable)

本文关键字:变量 访问 地址 范围 运行 很好 为什么      更新时间:2023-10-16

为什么运行良好?(并且连续好几次…)

double* p(nullptr);
cout << p << endl;      // "00000000"
{
    double d(82.);
    p = &d;
}
cout << p << endl;      // "0029FD98"
// Naughty, dirty, sneaky..
// .. but rather *pure* curiosity after all.. u_u
cout << *p << endl;     // "82", first surprise
*p = 83.;               // (getting further down the hole..)
cout << *p << endl;     // "83", and I almost feel disappointed. :(

d不应该在作用域之外,0029FD98不应该被释放吗?为什么我的操作系统不生我的气?我只是超级幸运吗?

您正在调用未定义的行为。根据c++规范,这里可能发生任何事情。未定义行为是一件非常糟糕的事情,因为它意味着你无法知道你的程序可能会做什么。

在使用特定编译器的特定平台上,这可能有效,因为变量是在堆栈上分配的,并且在程序运行时堆栈内存(通常)不会被释放。因此,0029FD98指的是内存分配区域内的地址(在本例中是堆栈)。一旦调用函数,这个位置很可能被该函数需要堆栈空间的任何内容覆盖。

在其他系统和/或编译器上,局部变量和/或堆栈的行为或实现可能不同,这可能输出一些随机数,或者它可能崩溃,或者它可能输出莎士比亚的集体作品。