为什么解除引用未初始化的指针不会崩溃?

时间:2016-06-17 11:20:26

标签: c++ pointers

我尝试运行此代码,它仅使用一个警告构建(' a'可能在此函数中未初始化....)但在运行时我的计算机崩溃并且仅显示"你好世界!"。

#include <iostream>
using namespace std;
int main()
{
 cout << "Hello world!" << endl;
 int p=20;
 int *a;
 *a=p;
 cout << *a << endl;
 cout << &p << endl;
 return 0;
}

但是当我省略这部分时:

cout << &p << endl;

我将再次发出相同的警告,但代码正常工作。任何人都可以解释发生了什么?

之前感谢。

1 个答案:

答案 0 :(得分:7)

由于你现在必须阅读十亿次,未定义的行为意味着任何事情都可能发生。

实际上,在这种情况下,如果你不采用p的地址,那么编译器不需要使它成为一个真正的“对象”,并且可以在编译时解决与它有关的一切-时间。因此,输出不确定值的命令正在“烘焙”到您的程序中,尽管逻辑无效取消引用。这仍然是未定义的行为,但在运行时没有内存访问,这将导致操作系统使程序崩溃。

按照您的意愿初始化您的变量。

注意警告。