为什么这个程序会进入无限循环?

时间:2012-12-27 12:50:24

标签: c

main()
{
int i;
int a[5];
for (i = 1; i <= 5; i++)
    a[i] = 0;
printf("Hello, how are you? ");
}

为什么程序没有退出循环?

6 个答案:

答案 0 :(得分:14)

C数组是从零开始的,所以你应该使用索引[0..4]而不是[1..5]。

写入a[5]写入超出数组范围的内容。这有不明确的结果;在您的情况下,这恰好是您的循环计数器i的地址,它被重置为0.

您可以使用

解决此问题
for (i = 0; i < 5; i++)

或者更好,

for (i = 0; i < sizeof(a)/sizeof(a[0]); i++)

作为你的循环。

答案 1 :(得分:5)

您正在访问数组越界(大小为5的数组的合法索引是索引0到4,而不是1到5)。就标准而言,这意味着您的程序会调用未定义的行为,并且可以以任何方式表现。

就实际实现而言,实际发生的事情可能是您的最后一次数组访问(即a[5] = 0;)写入内存中a之后的变量,恰好是i在你的系统上。所以i重置为0,循环将永远持续。

答案 2 :(得分:5)

#include <stdio.h>
main()
{
int a[5];
int i;
printf("Memory location of i = %p\n",&i);
printf("Memory location of a[5] = %p\n",&a[5]);
for (i = 1; i <=5; i++)
{
    a[i] = 0;
    sleep (2);
   printf("Value of i=%d\n",i);
}
printf("Hello, how are you? \n");
}

看到有趣的o / p .. [将理解为什么i的值变为0(零)]

mnds@mind-AcerPower-Series:/tmp$ ./a.out 
Memory location of i = 3218951772
Memory location of a[5] = 3218951772
Value of i=1
Value of i=2
Value of i=3
Value of i=4
Value of i=0

答案 3 :(得分:1)

如果你正在写a[5],那就超出了界限。

你的循环应该是:

for(i=0; i<5; i++)

答案 4 :(得分:1)

您传递整数数组的大小,数组大小为5,因此可以访问最大a[4]。 试试这个:

main()
{
    int i;
    int a[5];
    for (i = 0; i < 5; i++)
        a[i] = 0;
    printf("Hello, how are you? ");
}

答案 5 :(得分:0)

因为它调用未定义的行为,所以任何事情都可能发生(包括无限循环)。

当您的数组有5个元素时,这些元素的索引范围为0到4.访问a[5]是无效操作。

C中的数组是零索引的,所以为了使程序正常工作,你应该写完

for (i = 0; i < 5; i++)