作者:onlinewan
关键字:C\C++ 数组 越界
数组是类型相同的对象的序列,其中的对象称为数组元素。也可以将数组想像成一连串的用下标值编号的相邻存储区。
可能在某些编程语言中,一个下标变量是不允许超出数组定义中所设的界限的。但是在C和C++中,数组是没有这种安全措施的。下面先来看看数组下标越界的几种异常结果。
例1,访问没有分配给数组的内存空间。
int main ()
{
const int SIZE = 4;
int a[SIZE] = {12,40,45,10};
for (int i = 0; i<5 : i++)
cout << "\t a[" << i << "] = " << a[i] << endl;
}
运行结果如下:
a[0] = 12
a[1] = 40
a[2] = 45
a[3] = 10
a[4] = 12358
上面的结果中a[4]访问了不属于数组的内存空间,读取了一个无用的值,这个值是以前使用这个内存单元时保存的值。大家可能会说,这有什么大不了的,这不会影响什么的呀。不急,下面再看个例子。
例2,访问数组的一个不存在的下标元素时无意中改变了一个变量的值。
int main ()
{
int a[] = {10,12,31};
int x = 20;
cout << "x = " << x << endl;
a[3] = 50; //给一个不属于本数组的一个内存空间赋值,从而改变了变量x的值。
cout << "x = " << x <<endl;
}
运行结果:
x = 20
x = 50
看完上面的例子,应该知道数组元素下标越界带来的严重后果了吧。不过即使这样,程序还是可以正常运行。下面再看个例子,它引起的后果会引起程序不能正常运行。
例3,由于数组下标太大而引起程序崩溃。
int main ()
{
const int SIZE = 4;
int a[] = {10,20,30};
int x = 5;
cout << "x = " << x << endl;
a[200] = 88;
cout << "x = " << x << endl;
cout << a << endl;
}
上面的程序是无法正常运行的。我先不说出原因,还让大家回忆一下,我们是不是在操作电脑的时候,经常会遇到这样的情况:突然弹出一个警告框,说此内存地址不能写或不能读。这样的情况就会发生的上面的程序运行过程中。
有关C++中数组元素下标越界可能引起的问题就说这么多吧,通过上面的例子,我们应该知道在使用数组时,要特别注意这个问题,因为它很可能会导致严重的后果。