2011-06-13 61 views
0

我在下面的代码片段中有一个疑问。实际上,我在下面的代码中将所有的数组索引初始化为零,但这个for循环会无限次地运行。我发现我们试图访问数组的第26个索引的原因,因此,由于索引为0到25,所以值再次被初始化为0。所以for循环会无限地进行。解释一下这个东西背后的真正原因。整数索引在数组中增加

int array[26]; 
int i; 
for (i = 0; i <= 26; i++) 
    array[i]= 0; 

回答

10

您必须使用i < 26;否则你超出了数组边界。

由于在大多数系统上的堆栈布局,array[26]将指向用于i的内存,这会导致循环再次启动,因为您的循环体正在将i设置为0而不是适当的数组元素。

注意,你可以简单地使用int array[36] = { 0 };创建具有所有元素的数组被设置为0。

+0

当我们超越指数,它想改变索引值不是我的价值。这似乎是非常we thing的事情。如果某些身体在不知不觉中为了某种其他目的不使用而进行初始化。它会造成很大的损失。 – Pavunkumar 2011-06-13 09:12:53

+0

那么你写入数组以外的内存位置。很明显,在这个位置有*东西*,正如我所说的,通常它是在数组之后定义的变量。 – ThiefMaster 2011-06-13 09:14:05

+1

@pavun_cool:是的,它可以“造成很大的伤害”。你必须小心,不要超过缓冲区的末尾。这是软件世界存在大量错误的原因,其中一些导致太空火箭爆炸。欢迎来到低级编程。 – 2011-06-13 10:59:35

1

也许i位于内存array后,它在循环成为0i=26。即&array[26] == &i

0

我发现,我们正在试图访问数组的第26指数的原因,所以该值被初始化,因为有0〜25指数再次为零。所以for循环会无限地进行。

的原因是,你的循环变量i026包容。但是没有array[26] ..只有array[0]array[25](这是总共26个元素)。

您正在通过写入array[26]来调用未定义的行为;它就这么发生在你的执行运行中,iarray内存后面,并且由于错误的写入而意外地写入0i。这可能会导致无限循环。

而是写:

int array[26]; 
int i; 
for (i = 0; i < 26; i++) { 
    array[i] = 0; 
}