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)
一旦溢出分配的内存,您就处于"未定义的区域".可能是数组写入写入"i"存储在堆栈中的位置.
请注意,与Java和C#等语言不同,C不进行运行时边界检查,因此当您超出数组或字符串或malloced内存时,不保证可以执行任何有用的操作(如segfault).它不能保证做任何事情.它可能会崩溃,它可能继续运行,它可能会导致恶魔飞出你的鼻子.
发生的事情就是当你写入数组[5]时,你正在写信给我.它们在堆栈中相邻,在内存中,因此这是您可以预期的行为.
以这种方式思考,
你创建了一个包含5个元素的数组
int array[5];
Run Code Online (Sandbox Code Playgroud)
实际上,数组只是一个地址.[]中的数字指定要访问该地址的距离.所以:
所以,如果你一路走来
在C中没有自动检查边界,所以很高兴覆盖自己的内存.你在数组[5]之后放了"i",很可能数组[5]是i.
你只需将数组[5]或i设置为22,因此我就是22.现在我是22,你的下一个查找,到array [i]就是数组[22].这可以抓住发生在内存中那个位置的垃圾; 或者,如果你很幸运,崩溃.