daN*_*Set 10 c arrays for-loop infinite-loop
int main(void)
{
int i;
int array[5];
for (i = 0; i <= 20; i++)
array[i] = 0;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么上面的代码陷入无限循环?
sim*_*onc 21
您声明一个包含5个元素的数组,但是要向其中写入21个元素.写入数组的末尾会导致未定义的行为.在您的情况下,您正在写入循环计数器i,将其重置为0,可能在您分配时array[5].
如果要修复程序,请更改循环以写入正确数量的元素
int num_elems = sizeof(array) / sizeof(array[0]);
for (i = 0; i < num_elems ; i++)
Run Code Online (Sandbox Code Playgroud)
小智 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;
}
Run Code Online (Sandbox Code Playgroud)
在我的堆栈内存中,我得到了地址位置
i 存储在0xbfd1048c地址
并array存储在0xbfd10478位置
当你i在一个时间点递增每个循环的值时,地址array[i]相当于i(它只是指针取消引用)的地址
所以你所存储的array[i]只是i你的实例地址,所以你正在将你i的实例值写为0,正如你所提到的那样array[i] = 0,等同于i=0条件i<=20总是成功的.
现在大问题为什么以这种方式分配内存.
它是在运行时和内核资源的可用性决定的.
这就是为什么我们必须在阵列的极限中居住.
| 归档时间: |
|
| 查看次数: |
1204 次 |
| 最近记录: |