为什么这样运行正常? (连续几次......)
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
已取消分配?为什么我的操作系统疯狂在我身边?我只是超级幸运吗?
答案 0 :(得分:4)
您正在调用未定义的行为。根据C ++规范,这里可能发生任何事情。未定义的行为是一件非常糟糕的事情,因为这意味着您无法知道您的程序可能会做什么。 不惜一切代价避免它。
在您的特定平台上使用您的特定编译器,这可能有效,因为变量是在堆栈上分配的,并且堆栈内存在程序运行时(通常)不会被释放。结果,0029FD98
指的是分配的存储区域(在这种情况下,堆栈)内的地址。一旦调用函数,该位置很可能被该函数需要堆栈空间所覆盖。
在其他系统和/或编译器中,局部变量和/或堆栈的行为或执行方式不同,这可能会输出一些随机数,或者可能会崩溃,或者它可能会输出莎士比亚的集体作品。