数组越界

平时打题的时候,有时找一个bug找半天,就很难顶。

刚学数组那会儿,经常会看到数组越界四个字,当时我也是一脸懵逼 ,现在终于有时间来抓一下这条虫了。

定义:所谓数组越界,就是指数组下标变量的取值超过了初始定义时的大小,导致对数组元素的访问出现在数组的范围之外。

数组下标的取值范围只能预先推断一个值来确定数组的维数,作为秃头程序猿的我们,就得学会检验数组的边界啦。

一般情况下,数组的越界包括两种:数组下标取值越界与指向数组的指针的指向范围越界。

第一种:数组下标取值越界
意思就是访问数组的时候,下标的取值不在我们已经定义好的数组的取值范围内,而访问的是无法获取的内存地址。
例如,对于数组 int a[3],它的下标取值范围是[0,2](即a[0]、a[1] 与 a[2])。如果我们的取值不在这个范围内(如 a[3]),就会发生越界错误。贴个代码看看:

int a[3];
for(int i=0;i<4;i++)
    a[i]=i;
for(int i=0;i<4;i++)
	cout<<a[i]; 

以上代码是错误的,因为我们定义数组长度为3,那么数组就为a[0]、a[1]、a[2],然而在for循环中i的循环条件为i=0且i<4,显然可以有0、1、2、3这四种取值,大于数组的取值范围,即数组越界了。

怎么修改?
把 i<4 改成 i<3 即可。

第二种:指向数组的指针的指向范围越界
一般在定义数组时,会返回一个指向第一个变量的头指针,对这个指针进行加减运算可以向前或向后移动这个指针,进而访问数组中所有的变量。但在移动指针时,如果不注意移动的次数和位置,会使指针指向数组以外的位置,导致数组越界。还是贴个代码就明白了:

int *p;
int a[5];
p=a;			//数组a的头指针赋值给指针p
for(int i=0;i<10;i++)
{
	*p=i+10;  
    p++;       //指向下一变量 
}

以上为错误代码,for 循环会使指针 p 向后移动 10 次,每次都向指针指向的单元赋值。但是,这里数组 a 的下标取值范围是 [0,4](即 a[0]、a[1]、a[2]、a[3] 与 a[4])。因此,后 5 次的操作会对未知的内存区域赋值,导致系统发生错误。

正确的操作应该是指针移动的次数与数组中的变量个数相同

怎么修改?
把 i<10 改成 i<5 即可。

以上是本蒟蒻一点小总结,希望对各位兄台有帮助(溜

你可能感兴趣的:(数组越界)