为什么我的程序中存在无限循环?
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个值?