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

5 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;
}
Run Code Online (Sandbox Code Playgroud)

Pau*_*lin 9

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

请注意,与Java和C#等语言不同,C不进行运行时边界检查,因此当您超出数组或字符串或malloced内存时,不保证可以执行任何有用的操作(如segfault).它不能保证做任何事情.它可能会崩溃,它可能继续运行,它可能会导致恶魔飞出你的鼻子.

  • 这正是发生的事情."array"和"i"都存储在堆栈中,"i"紧跟在"array"之后.因此&array [5]指的是与&i完全相同的位置.写入数组[5]将写入存储在堆栈上i位置的值.在你的循环中,当数组溢出时,你正在写入22,因此从4跳到22. (6认同)

Dou*_* T. 7

发生的事情就是当你写入数组[5]时,你正在写信给我.它们在堆栈中相邻,在内存中,因此这是您可以预期的行为.

以这种方式思考,

你创建了一个包含5个元素的数组

int array[5];
Run Code Online (Sandbox Code Playgroud)

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

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

所以,如果你一路走来

  • 数组[5]在内存中超过地址"数组"的5个整数

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

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