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

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)


P.P*_*.P. 8

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

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


小智 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总是成功的.

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

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

这就是为什么我们必须在阵列的极限中居住.

  • 示例代码和地址记录是一个很好的答案方法.一个小点 - 堆栈中项目之间的偏移是在编译时决定的,而不是在运行时决定的. (5认同)