显然,有时这段代码会进入无限循环,有时会终止或有时会因机器而出现分段错误。为什么行为不一致?
void loop() {
int x[512];
int i=0;
while (i++ <512) {
x[i] = 0;
}
}
int main () {
printf("\nCalling loop -->>\n");
loop();
}
答案 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;