int main(void)
{
int i;
int array[5];
for (i = 0; i <= 20; i++)
array[i] = 0;
return 0;
}
为什么上面的代码陷入无限循环?
答案 0 :(得分:21)
您声明一个包含5个元素的数组,但要为其写入21个元素。写入数组的末尾会导致未定义的行为。在您的情况下,您正在写入循环计数器i
,将其重置为0,可能在您指定array[5]
时。
如果要修复程序,请更改循环以写入正确数量的元素
int num_elems = sizeof(array) / sizeof(array[0]);
for (i = 0; i < num_elems ; i++)
答案 1 :(得分:8)
您通过覆盖超出允许的内存来调用未定义的行为。所以任何事情都可能发生。
最有可能的是,它覆盖了循环计数器。
答案 2 :(得分:8)
以下是给定代码中发生的事情。
#include<stdio.h>
#include<string.h>
int main(void)
{
int i;
int array[5];
for (i = 0; i <= 20; i++)
{
printf("%p %p \n",&i,&array[i]);
printf("the value of i is %d \n",i);
sleep(1);
array[i] = 0;
printf("i may be modified here lets see what i is %d \n", i);
}
return 0;
}
在我的堆栈内存中,我将地址位置设为
i
存储在0xbfd1048c地址
和array
存储在0xbfd10478地址
当您在一个时间点为每个循环递增i
值时,array[i]
的地址等同于i
的地址(它只是指针取消引用)
因此,您在array[i]
存储的内容只是i
的实例地址,因此您正在将i
的实例值写为0,如您所述{{ 1}}相当于array[i] = 0
,因此条件i=0
总是成功。
现在大问题为什么以这种方式分配内存。
在运行时决定内核资源的可用性。
这就是为什么我们必须在阵列的极限中居住。
答案 3 :(得分:2)
问题是当你尝试访问数组范围之外的元素时,这个元素只有5个大 - 但是在一个21大的循环中。
int main(void)
{
int i;
int array[5];
for (i = 0; i < 5; i++)
array[i] = 0;
return 0;
}
答案 4 :(得分:1)
我没有看到任何无限循环条件,但你在一个带有5个“槽”的数组上设置了20个值???