for循环丢失了几个带有segfault的索引

时间:2009-06-01 18:15:54

标签: c for-loop segmentation-fault

应用程序的输出(底部)如下:

元素索引号:0元素内容:22
元素索引号:1元素内容:22
元素索引号:2元素内容:22
元素索引号:3元素内容:22
元素索引号:4元素内容:22
元素索引号:22元素内容:134513712

为什么标有5 - 21的索引元素错过了?我理解这段代码可能会被segfault做到溢出的数组的边界,它的目的是为了做到这一点,我不感兴趣为什么这个代码是坏的,只是为什么跳过某些索引。

#include <stdio.h>
int main(){

int array[5];

int i;
for(i=0; i<10; ++i){
    array[i] = 22;
    printf("Element index number: %d Element contents: %d\n", i, array[i]);
}
return 0;
}

5 个答案:

答案 0 :(得分:9)

一旦溢出分配的内存,您就处于“未定义的区域”。可能是数组写入写入“i”存储在堆栈中的位置。

请注意,与Java和C#等语言不同,C不进行运行时边界检查,因此当您超出数组或字符串或malloced内存时,不保证可以执行任何有用的操作(如segfault)。它不能保证做任何事情。它可能会崩溃,它可以继续运行,it could cause demons to fly out your nose

答案 1 :(得分:7)

当你写入数组[5]时,你正在写给我。它们在堆栈中相邻,在内存中,因此这是您可以期待的行为。

以这种方式思考,

你在

创建了一个包含5个元素的数组
int array[5];

实际上,数组只是一个地址。 []中的数字指定要访问该地址的距离。所以:

  • array [0] 0 ints in memory after address address“array”
  • array [1]在内存中超过1个整数地址“array” ...
  • array [4]在内存中超过4个整数地址“array”(你为数组保留的最后一个int)

所以,如果你一直到

  • array [5]在内存中超过地址“array”
  • 的5个整数

C中没有自动检查边界,所以很高兴覆盖自己的内存。你在数组[5]之后放了“i”,很可能数组[5]是i。

你只需将数组[5]或i设置为22,因此我就是22.现在我是22,你的下一个查找,到数组[i]实际上是数组[22]。这可以抓住发生在内存中那个位置的垃圾;或者,如果你很幸运,崩溃。

答案 2 :(得分:2)

@Doug有它,但让我们稍微扩展一下。

你有数组[5]和i作为自动变量,因此它们在入口处被分配在堆栈上,所以你分配了6个单元:array [0],array [1],... array [4],然后我。

当你将i设置为5时,array [i]指向包含i的堆栈上的单元格。然后你给它分配了22。所以现在i = 22,正如你所印刷的那样。

然后你得到array [i]或array [22],这是stck的结尾;那里的随机值恰好是那么大的数字。

答案 3 :(得分:0)

很可能本地变量“i”的存储位于堆栈“阵列”之后,因此&amp; array [5] ==&amp; i,这意味着当您分配时,您将22分配给“i” 22到数组[5]。

答案 4 :(得分:-1)

您已经声明了一个包含5个整数的数组,但是您的for循环将值写入10个条目。

更改

int array[5];

int array[10];