应用程序的输出(底部)如下:
元素索引号: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;
}
答案 0 :(得分:9)
一旦溢出分配的内存,您就处于“未定义的区域”。可能是数组写入写入“i”存储在堆栈中的位置。
请注意,与Java和C#等语言不同,C不进行运行时边界检查,因此当您超出数组或字符串或malloced内存时,不保证可以执行任何有用的操作(如segfault)。它不能保证做任何事情。它可能会崩溃,它可以继续运行,it could cause demons to fly out your nose。
答案 1 :(得分:7)
当你写入数组[5]时,你正在写给我。它们在堆栈中相邻,在内存中,因此这是您可以期待的行为。
以这种方式思考,
你在
创建了一个包含5个元素的数组int array[5];
实际上,数组只是一个地址。 []中的数字指定要访问该地址的距离。所以:
所以,如果你一直到
C中没有自动检查边界,所以很高兴覆盖自己的内存。你在数组[5]之后放了“i”,很可能数组[5]是i。
你只需将数组[5]或i设置为22,因此我就是22.现在我是22,你的下一个查找,到数组[i]实际上是数组[22]。这可以抓住发生在内存中那个位置的垃圾;或者,如果你很幸运,崩溃。
答案 2 :(得分:2)
你有数组[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];