1

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

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解除分配吗?为什么我的操作系统不生我的?我只是超级幸运吗?

4

1 回答 1

4

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

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

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

于 2014-07-26T05:50:57.193 回答