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

时间:2012-12-24 10:55:41

标签: 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;
}

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

5 个答案:

答案 0 :(得分:21)

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

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

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

答案 1 :(得分:8)

您通过覆盖超出允许的内存来调用未定义的行为。所以任何事情都可能发生。

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

答案 2 :(得分: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;
}

在我的堆栈内存中,我将地址位置设为

i存储在0xbfd1048c地址

array存储在0xbfd10478地址

当您在一个时间点为每个循环递增i值时,array[i]的地址等同于i的地址(它只是指针取消引用)

因此,您在array[i]存储的内容只是i的实例地址,因此您正在将i的实例值写为0,如您所述{{ 1}}相当于array[i] = 0,因此条件i=0总是成功。

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

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

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

答案 3 :(得分:2)

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

int main(void)
{
    int i;
    int array[5];

    for (i = 0; i < 5; i++)
    array[i] = 0;

    return 0;
}

答案 4 :(得分:1)

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