相同的代码片段,Windows和Linux上的不同行为

Jim*_* Lu 0 c++ linux windows

我知道下面的代码不正确,因为我正在为任意地址赋值.

#include <iostream>

using namespace std;

int main()
{
int *i;
*i = 12;     // Not right.... i is not initialized.
cout << *i << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)

这段代码在Linux上给出了分段错误.但是,在Windows上输出12 ...

为什么它可以在Windows上运行?我没有将12分配到某个任意位置我的程序没有特权吗?

Naw*_*waz 12

它实际上调用了未定义的行为.所以这两种行为都是正确的,即它可能会产生段错误,或者可能不会.

在下一次运行中,Windows版本可能会崩溃,Linux版本可能会向您发送威胁邮件!

换句话说,任何事情都可能发生.C++规范和(符合标准的)编译器都没有给出任何保证,这就是C++规范将这种行为称为未定义行为的原因.