#include <stdio.h>
int main()
{
int i = 0;
int arr[] = {1,2,3,4,5,6,7,8,9,10};
for(i=0; i<=12; i++)
{
arr[i] = 0;
printf("hello bit\n");
}
return 0;
}
i = 10时,数组就已经越界
堆栈帧中 arr[0]~ arr[11] 之后是 而 访问a[12]时,其地址也是 i所在的地址,因此当你给a[5]赋值为0的时候,也就给 i 赋值为0了。
原因在于C在编译的时候,不会对数组下标溢出做检查。
以后用类似这样的语句时,一定要注意控制数组下标,不要溢出了。
内存分配看下这篇博客
内存分配
这里对代码进行一个修改.将for循环的i<=12改为11或10时,便出现数组越界的中断操作,
这里便有了疑惑,为什么i的地址为arr[12],而不是在其它内存地址,又或者在数组之后,而不是中间空了8个字节.
这是因为编译器给数组分配内存时留了8个字节的空间,以防数组越界出现死循环,然而越界严重的话还是会出现死循环.