---------------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;
}

输出结果为:

C语言基础 数组越界之后
但当循环条件改变为i<=3,arr[3]数组越界,则会出现问题

for(i=0;i<=3;i++)
	{
		arr[i]=0;
		printf("    %d\n",i);
	}

visual 2012中会显示程序崩溃,而在c99中则会出现012012012012……的无限死循环。这是为什么呢?下面就来为各位揭开数组越界的面纱!

变量,数组变量在编译器中以栈的形式存放,如图:

变量按先后顺序依次存入栈中先存入的在栈底,地址大,后存入的靠近栈顶,地址小
C语言基础 数组越界之后

将i,arr[3]存入则为
C语言基础 数组越界之后
在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操作系统中,变量与变量之间安放了两颗炸弹,若越界则会触碰炸弹使程序崩溃,C语言基础 数组越界之后

i,arr[4],arr[3],arr[2],arr[1]地址,由此可看出i与arr之间存在两个字符的间隔
C语言基础 数组越界之后

但若跳过两颗炸弹则又会产生于c99同原理的情况,进入死循环C语言基础 数组越界之后

以上就是数组越界再c99和visualx86中的情况。

通过这一系列的分析,可知

  1. 数组一定要注意下标不要越界,否则会出现各种奇怪的现象
  2. 不同的操作系统会有不同的处理方式,我们一定要去探索其中的原理
  3. visualX86中,变量以栈的形式存储,变量与变量之间有一个缓冲空间,同时也是一个危险区,一旦有不符合的操作出现便会触碰炸弹,引发程序崩溃。

下次就该谈论指针了~~~
--------------end--------------

相关文章: