main()
{
int i;
int a[5];
for (i = 1; i <= 5; i++)
a[i] = 0;
printf("Hello, how are you? ");
}
为什么程序没有退出循环?
main()
{
int i;
int a[5];
for (i = 1; i <= 5; i++)
a[i] = 0;
printf("Hello, how are you? ");
}
为什么程序没有退出循环?
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++)
作为你的循环。
您正在越界访问数组(大小为 5 的数组的合法索引是索引 0 到 4,而不是 1 到 5)。就标准而言,这意味着您的程序会调用未定义的行为,并且可以按照自己喜欢的方式行事。
就实际实现而言,实际发生的情况可能是您的最后一次数组访问(即a[5] = 0;
)覆盖了a
内存中出现的变量,该变量恰好i
在您的系统上。Soi
被重置为 0 并且循环永远继续。
#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
如果你正在写作a[5]
,那就超出了界限。
你的循环应该是:
for(i=0; i<5; i++)
您传递整数数组的大小,数组大小为 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 到 4。访问a[5]
是无效操作。
C中的数组是零索引的,所以为了你的程序正常工作,你应该写
for (i = 0; i < 5; i++)