main()
{
int i;
int a[5];
for (i = 1; i <= 5; i++)
a[i] = 0;
printf("Hello, how are you? ");
}
为什么程序没有退出循环?
答案 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++)