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

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

    return 0;
}

为什么上面的代码会陷入死循环?

4

5 回答 5

21

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

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

int num_elems = sizeof(array) / sizeof(array[0]);
for (i = 0; i < num_elems ; i++)
于 2012-12-24T10:57:22.233 回答
8

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

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

于 2012-12-24T10:57:23.653 回答
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,正如您所提到array[i] = 0的,这相当于i=0因此条件i<=20始终成功。

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

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

所以这就是为什么我们必须忍受数组的限制。

于 2012-12-24T11:41:08.903 回答
2

问题是当您尝试访问数组边界之外的元素时,该元素只有 5 大 - 但在一个 21 大的循环中。

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

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

    return 0;
}
于 2012-12-24T10:57:39.700 回答
1

我没有看到任何无限循环条件,但是您在具有 5 个“插槽”的数组上设置了多达 20 个值???

于 2012-12-24T10:57:49.387 回答