为什么我的程序中存在无限循环?

int main(void) { int i; int array[5]; for (i = 0; i <= 20; i++) array[i] = 0; return 0; } 

为什么上面的代码陷入无限循环?

这是给定代码中发生的事情。

 #include #include 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总是成功。

现在大问题为什么以这种方式分配内存。

它在运行时和内核的资源可用性决定。

这就是为什么我们必须在arrays的极限中居住。

声明一个包含5个元素的数组,但是要写入21个元素。 写入数组的末尾会导致未定义的行为。 在你的情况下,你正在写入循环计数器i ,将其重置为0,可能是在分配array[5]

如果要修复程序,请更改循环以写入正确数量的元素

 int num_elems = sizeof(array) / sizeof(array[0]); for (i = 0; i < num_elems ; i++) 

您通过覆盖超出允许的内存来调用未定义的行为。 所以一切都会发生。

最有可能的是,它覆盖了循环计数器。

问题是当你尝试访问数组范围之外的元素时,这个元素只有5个大 – 但是在一个21大的循环中。

 int main(void) { int i; int array[5]; for (i = 0; i < 5; i++) array[i] = 0; return 0; } 

我没有看到任何无限循环条件,但你在一个带有5个“槽”的arrays上设置了20个值?