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

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

4

6 回答 6

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++)

作为你的循环。

于 2012-12-27T12:51:35.150 回答
5

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

就实际实现而言,实际发生的情况可能是您的最后一次数组访问(即a[5] = 0;)覆盖了a内存中出现的变量,该变量恰好i在您的系统上。Soi被重置为 0 并且循环永远继续。

于 2012-12-27T12:54:03.123 回答
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
于 2012-12-27T13:10:11.290 回答
1

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

你的循环应该是:

for(i=0; i<5; i++)
于 2012-12-27T12:52:26.943 回答
1

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

main()
{
    int i;
    int a[5];
    for (i = 0; i < 5; i++)
        a[i] = 0;
    printf("Hello, how are you? ");
}
于 2012-12-27T12:52:42.110 回答
0

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

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

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

for (i = 0; i < 5; i++)
于 2012-12-27T12:53:00.563 回答