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

use*_*684 -2 c++ pointers

我试着运行这个代码,它只用一个警告('a'可能在这个函数中未初始化......)构建,但在运行时我的计算机崩溃并只显示"Hello world!".

#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;
}
Run Code Online (Sandbox Code Playgroud)

但是当我省略这部分时:

cout << &p << endl;
Run Code Online (Sandbox Code Playgroud)

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

谢谢之前.

Lig*_*ica 7

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

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

只需初始化您的变量,就像您应该的那样.

注意警告.