我尝试运行此代码,它仅使用一个警告构建(' 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;
我将再次发出相同的警告,但代码正常工作。任何人都可以解释发生了什么?
之前感谢。
答案 0 :(得分:7)
由于你现在必须阅读十亿次,未定义的行为意味着任何事情都可能发生。
实际上,在这种情况下,如果你不采用p
的地址,那么编译器不需要使它成为一个真正的“对象”,并且可以在编译时解决与它有关的一切-时间。因此,输出不确定值的命令正在“烘焙”到您的程序中,尽管逻辑无效取消引用。这仍然是未定义的行为,但在运行时没有内存访问,这将导致操作系统使程序崩溃。
按照您的意愿初始化您的变量。
注意警告。