调试下面提到的代码进入无限循环的原因
int a[10];
int i;
for(i=0;i<=10;i++) {
a[i]=0;
}
我无法找到任何有效的解释。 虽然有一种可能性[9]指向我......但它似乎并不令人信服
答案 0 :(得分:6)
“缓冲区溢出”的经典副作用。在这种情况下,正在发生的是i的值被覆盖。检查变量的范围,它是一个10字节0到9的数组。但是你循环11个字节0到10.
将循环更改为
int a[10];
int i;
for(i=0;i<10;i++) {
a[i]=0;
}
它不会进入无限循环。同样,这是“缓冲区溢出”的问题,并且可能具有未定义的行为。在你的情况下,未定义的行为是无限循环。
答案 1 :(得分:2)
答案 2 :(得分:2)
此代码具有未定义的行为。但是如果它进入无限循环,最合适的解释是a[10] = 0
用0覆盖i
,因为i
是在a
之后立即定义的,因此,在内存中最有可能放在数组元素之后作为连续元素。
答案 3 :(得分:0)
您可以尝试这样做,以便您不会得到未定义的行为:
int i, a[10];
for(i = 0; i <= 9; i++)
a[i]=0;