---------------statr reading---------------
引言
数组在C语言中占据重要位置,但由于数组具有下标从“0”开始的特性,常常会出现数组下标越界越界的情况,今天我们就来谈谈数组越界的后果,简易分析数组越界出现奇怪现象的原因。
请看以下代码
#include<stdio.h>
void Count()
{
int i;
int arr[3];
for(i=0;i<3;i++)
{
arr[i]=0;
printf(" %d\n",i);
}
}
int main()
{
Count();
return 0;
}
输出结果为:
但当循环条件改变为i<=3,arr[3]数组越界,则会出现问题
for(i=0;i<=3;i++)
{
arr[i]=0;
printf(" %d\n",i);
}
visual 2012中会显示程序崩溃,而在c99中则会出现012012012012……的无限死循环。这是为什么呢?下面就来为各位揭开数组越界的面纱!
变量,数组变量在编译器中以栈的形式存放,如图:
变量按先后顺序依次存入栈中先存入的在栈底,地址大,后存入的靠近栈顶,地址小
将i,arr[3]存入则为
在c99中
当i<=3时,i=3,arr[3]越界,arr[3]地址由arr[2]增加四个字节变成了变量i的地址,arr[3]=0,i中的值i=0,所以再次进入循环,i<=3,形成012012012012012的死循环。
再Windows visual x86里则是另一种情况
再Windows操作系统中,变量与变量之间安放了两颗炸弹,若越界则会触碰炸弹使程序崩溃,
i,arr[4],arr[3],arr[2],arr[1]地址,由此可看出i与arr之间存在两个字符的间隔
但若跳过两颗炸弹则又会产生于c99同原理的情况,进入死循环
以上就是数组越界再c99和visualx86中的情况。
通过这一系列的分析,可知
- 数组一定要注意下标不要越界,否则会出现各种奇怪的现象
- 不同的操作系统会有不同的处理方式,我们一定要去探索其中的原理
- visualX86中,变量以栈的形式存储,变量与变量之间有一个缓冲空间,同时也是一个危险区,一旦有不符合的操作出现便会触碰炸弹,引发程序崩溃。
下次就该谈论指针了~~~
--------------end--------------