我对以下代码段有一个疑问。实际上我在下面的代码中将所有数组索引初始化为零,但是这个for
循环是无限的。我发现我们正在尝试访问数组的第26个索引,因此该值会再次初始化为零,因为有0到25个索引。所以for循环是无限的。解释一下这个东西背后的实际原因。
int array[26];
int i;
for (i = 0; i <= 26; i++)
array[i]= 0;
答案 0 :(得分:10)
你必须使用i < 26
;否则你超过数组范围。
由于大多数系统上的堆栈布局array[26]
将指向用于i
的内存,这会导致循环再次启动,因为循环体将i设置为0而不是适当的数组元素。
请注意,您只需使用int array[36] = { 0 };
创建数组,并将所有元素设置为0。
答案 1 :(得分:1)
可能i
位于内存中的array
之后,并且在循环中0
时变为i=26
。即&array[26] == &i
。
答案 2 :(得分:0)
我发现我们正在尝试访问数组的第26个索引,因此该值再次初始化为零,因为有0到25个索引。所以for循环是无限的。
原因是您的循环变量i
从0
变为26
包含。但是array[26]
只有array[0]
到array[25]
(共有26个元素)。
您正在通过写入array[26]
来调用未定义的行为;在你的执行运行中恰好发生了,i
在内存array
之后布局,并且你不小心将0
写入i
由于错误的写。这可能导致无限循环。
而是写:
int array[26];
int i;
for (i = 0; i < 26; i++) {
array[i] = 0;
}