为什么下面的代码进入无限循环?

时间:2016-12-16 09:39:39

标签: c++ c arrays loops

调试下面提到的代码进入无限循环的原因

int a[10]; 
int i; 
for(i=0;i<=10;i++) { 
   a[i]=0; 
}

我无法找到任何有效的解释。 虽然有一种可能性[9]指向我......但它似乎并不令人信服

4 个答案:

答案 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)

i的值等于10

 a[i]=0;

off by one访问权限。它调用undefined behavior。任何事情都可能发生。

答案 2 :(得分:2)

此代码具有未定义的行为。但是如果它进入无限循环,最合适的解释是a[10] = 0用0覆盖i,因为i是在a之后立即定义的,因此,在内存中最有可能放在数组元素之后作为连续元素。

答案 3 :(得分:0)

您可以尝试这样做,以便您不会得到未定义的行为:

int i, a[10];
for(i = 0; i <= 9; i++) 
    a[i]=0;