为什么这段代码在不同的机器上会导致不同的行为?

Why does this code result in different behavior on different machines?

本文关键字:机器 代码 为什么 段代码      更新时间:2023-10-16

显然,这段代码有时会进入无限循环,有时会终止,有时会根据机器出现分段错误。为什么行为不一致?

void loop() {
    int x[512]; 
    int i=0; 
    while (i++ <512) { 
        x[i] = 0; 
    } 
} 
int main () { 
    printf("nCalling loop -->>n"); 
    loop(); 
}

因为您正在执行后增量。当i是511时,它传递不等式,但随后它增加到512。分配x[512]访问冲突到内存,可能是可能不是(它是未定义)由您的应用程序拥有。正如在注释中所述,在不同的平台上您会遇到略有不同的行为,因为这个错误会导致所谓的未定义行为。换句话说,这个(错误的)操作的结果没有由c++标准定义。由于不同的编译器和操作系统具有不同的底层实现-您将获得不同的行为

如果你调用未定义的行为(正如你所做的),你会得到未定义的行为-这意味着不同的编译器可以在同一台机器上给出不同的结果,不同的编译器在不同的机器上可以给出不同的结果;见鬼,一台机器上的一个编译器可以看到月亮的相位,并根据它决定做不同的事情!它们都是正确的,因为未定义行为就是——未定义。

如果你得到一个无限循环,机会是&x[512] == &i,当你把0写到x[512]时(这是未定义的行为),你把i归零,循环继续。

如果它崩溃了,很可能是x[512]与调用堆栈上的一些关键控制信息一致,并且由于践踏返回地址或帧指针,您已经完全搞砸了系统。

但是,不管怎样,机器和编译器工作得很好;你的代码就是问题所在。你的循环应该是:

while (i < 512)
    x[i++] = 0;