1

显然,有时此代码会进入无限循环,有时会终止或有时会出现分段错误,具体取决于机器。为什么行为不一致?

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

2 回答 2

5

因为你正在做post-increment。什么时候i是 511 它通过了不等式,但随后它增加到 512。分配x[512]是对您的应用程序可能拥有或可能不拥有的内存访问冲突它是undefined )。如评论中所述,您在不同平台上遇到的行为略有不同,因为此错误会导致所谓的未定义行为。换句话说,这个(错误的)操作的结果不是由 C++ 标准定义的。而且由于不同的编译器和操作系统有不同的底层实现——你会得到不同的行为。

于 2013-03-20T00:52:53.970 回答
1

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

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

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

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

while (i < 512)
    x[i++] = 0;
于 2013-03-20T00:55:00.783 回答