显然,有时此代码会进入无限循环,有时会终止或有时会出现分段错误,具体取决于机器。为什么行为不一致?
void loop() {
int x[512];
int i=0;
while (i++ <512) {
x[i] = 0;
}
}
int main () {
printf("\nCalling loop -->>\n");
loop();
}
显然,有时此代码会进入无限循环,有时会终止或有时会出现分段错误,具体取决于机器。为什么行为不一致?
void loop() {
int x[512];
int i=0;
while (i++ <512) {
x[i] = 0;
}
}
int main () {
printf("\nCalling loop -->>\n");
loop();
}
因为你正在做post-increment。什么时候i
是 511 它通过了不等式,但随后它增加到 512。分配x[512]
是对您的应用程序可能拥有或可能不拥有的内存的访问冲突(它是undefined )。如评论中所述,您在不同平台上遇到的行为略有不同,因为此错误会导致所谓的未定义行为。换句话说,这个(错误的)操作的结果不是由 C++ 标准定义的。而且由于不同的编译器和操作系统有不同的底层实现——你会得到不同的行为。
如果你调用未定义的行为(就像你做的那样),你会得到未定义的行为——这意味着不同的编译器可以在同一台机器上给出不同的结果,不同的编译器在不同的机器上可以给出不同的结果;哎呀,单台机器上的单个编译器可以查看月相并根据它决定做不同的事情!它们都是正确的,因为未定义的行为正是——未定义的。
如果你得到一个无限循环,很可能&x[512] == &i
当你写零x[512]
(这是未定义的行为)时,你归零i
并且循环继续。
如果它崩溃了,很可能x[512]
与调用堆栈上的一些关键控制信息相吻合,并且通过践踏返回地址或帧指针,您已经完全搞砸了系统。
但是,无论如何,机器和编译器工作正常;你的代码是问题所在。你的循环应该是:
while (i < 512)
x[i++] = 0;