#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("Hell\n");
}
return 0;
}
在visualstudio中,死循环(个别编译器有所不同,取决与编译器)
显然运行后死循环了;
为什么呢,
我们来看,在循环第11次时虽然越界访问了,但可见并没有出现问题,但是当第十二次时、
第十二次调试
再走一步
很突然的,arr[12]竟然把int i的值修改为了0;导致了死循环
么为什么会这样呢?
首先,局部变量是存放在栈上的,
栈区内存的分配是先使用高地址再使用低地址;
既然先使用高地址,那么先开辟i时,i自然存放在高地址中;同时数组元素的地址都是由低到高;
通过画图理解
当我们越界访问arr[i=12]的时候,很巧的访问到了int i的地址,于是将i的值改变了;导致了程序的死循环;
在不同编译器中,i与arr[9]之间预留的空间是不固定的,vs预留的是2个空间;
如有错误望评论纠正;