为什么此代码会在不同的计算机上导致不同的行为?

时间:2013-03-20 00:47:40

标签: c++ undefined-behavior

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

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

2 个答案:

答案 0 :(得分:5)

因为你正在做后增量。当i为511时,它会传递不等式,但随后会增加到512.将{{1>} 访问冲突分配给内存可能或<您的应用程序拥有的strong>可能不是(它是未定义)。如评论中所述,您在不同平台上的行为略有不同,因为此错误会导致所谓的未定义行为。换句话说,这个(错误的)操作的结果不是由C ++标准定义的。由于不同的编译器和操作系统具有不同的底层实现 - 您将获得不同的行为。

答案 1 :(得分:1)

如果您调用未定义的行为(就像您一样),您将获得未定义的行为 - 这意味着不同的编译器可以在同一台机器上提供不同的结果,不同机器上的不同编译器可以提供不同的结果;哎呀,单个机器上的单个编译器可以查看月亮的阶段,并根据它决定做不同的事情!而且它们都是正确的,因为未定义的行为恰恰是 - undefined。

如果你得到一个无限循环,则可能是&x[512] == &i,当你向x[512]写入零(这是未定义的行为)时,你将i归零并继续循环。

如果它崩溃了,那么x[512]可能与调用堆栈上的一些关键控制信息重合,并且通过践踏返回地址或帧指针,你已经完全搞砸了系统。

但是,无论如何,机器和编译器工作正常;你的代码就是问题。你的循环应该是:

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