我在下面的代码片段中有一个疑问。实际上,我在下面的代码中将所有的数组索引初始化为零,但这个for
循环会无限次地运行。我发现我们试图访问数组的第26个索引的原因,因此,由于索引为0到25,所以值再次被初始化为0。所以for循环会无限地进行。解释一下这个东西背后的真正原因。整数索引在数组中增加
int array[26];
int i;
for (i = 0; i <= 26; i++)
array[i]= 0;
我在下面的代码片段中有一个疑问。实际上,我在下面的代码中将所有的数组索引初始化为零,但这个for
循环会无限次地运行。我发现我们试图访问数组的第26个索引的原因,因此,由于索引为0到25,所以值再次被初始化为0。所以for循环会无限地进行。解释一下这个东西背后的真正原因。整数索引在数组中增加
int array[26];
int i;
for (i = 0; i <= 26; i++)
array[i]= 0;
您必须使用i < 26
;否则你超出了数组边界。
由于在大多数系统上的堆栈布局,array[26]
将指向用于i
的内存,这会导致循环再次启动,因为您的循环体正在将i设置为0而不是适当的数组元素。
注意,你可以简单地使用int array[36] = { 0 };
创建具有所有元素的数组被设置为0。
也许i
位于内存array
后,它在循环成为0
时i=26
。即&array[26] == &i
。
我发现,我们正在试图访问数组的第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;
}
当我们超越指数,它想改变索引值不是我的价值。这似乎是非常we thing的事情。如果某些身体在不知不觉中为了某种其他目的不使用而进行初始化。它会造成很大的损失。 – Pavunkumar 2011-06-13 09:12:53
那么你写入数组以外的内存位置。很明显,在这个位置有*东西*,正如我所说的,通常它是在数组之后定义的变量。 – ThiefMaster 2011-06-13 09:14:05
@pavun_cool:是的,它可以“造成很大的伤害”。你必须小心,不要超过缓冲区的末尾。这是软件世界存在大量错误的原因,其中一些导致太空火箭爆炸。欢迎来到低级编程。 – 2011-06-13 10:59:35