int main(void)
{
int i;
int array[5];
for (i = 0; i <= 20; i++)
array[i] = 0;
return 0;
}
为什么上面的代码会陷入死循环?
int main(void)
{
int i;
int array[5];
for (i = 0; i <= 20; i++)
array[i] = 0;
return 0;
}
为什么上面的代码会陷入死循环?
您声明了一个包含 5 个元素的数组,但向其中写入了 21 个元素。写入数组末尾会导致未定义的行为。在您的情况下,您正在写入循环计数器i
,将其重置为 0,可能是在您分配array[5]
.
如果要修复程序,请更改循环以写入正确数量的元素
int num_elems = sizeof(array) / sizeof(array[0]);
for (i = 0; i < num_elems ; i++)
您通过覆盖超出允许的内存来调用未定义的行为。所以任何事情都可能发生。
最有可能的是,它正在覆盖循环计数器。
这是给定代码中发生的事情。
#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,正如您所提到array[i] = 0
的,这相当于i=0
因此条件i<=20
始终成功。
现在最大的问题是为什么以这种方式分配内存。
它是在运行时和内核资源的可用性决定的。
所以这就是为什么我们必须忍受数组的限制。
问题是当您尝试访问数组边界之外的元素时,该元素只有 5 大 - 但在一个 21 大的循环中。
int main(void)
{
int i;
int array[5];
for (i = 0; i < 5; i++)
array[i] = 0;
return 0;
}
我没有看到任何无限循环条件,但是您在具有 5 个“插槽”的数组上设置了多达 20 个值???