为什么这样运行正常? (访问范围外变量的地址)

时间:2014-07-26 05:45:23

标签: c++ pointers memory-management scope memory-access

为什么这样运行正常? (连续几次......)

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. :(

Isn&#t; t d是否应该超出范围且0029FD98已取消分配?为什么我的操作系统疯狂在我身边?我只是超级幸运吗?

1 个答案:

答案 0 :(得分:4)

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

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

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