C++语言中数组越界访问系统不会给出任何的提示,程序员可以超出数组边界进行读/写从而造成内存的混乱,而这种错误对初学者来说是很容易出现的、而又偏偏是很难调试的,因为系统不会给出错误的提示,所以就这样使用数组是不安全的。
int *p=newint[1];
p[3]=2;
cout<<p[3]<<endl;
照样可以编译通过而且运行是没有错误。
给出一种解决方案
例如:
#include<iostream.h>
classCharArray
{
public:
CharArray(intl)
{
Length= l;
Buff= newchar[Length];//千万不能把[]写成()否则编译的时候能通过,运行时候会提示:
}
~CharArray(){ delete Buff; }
intGetLength() { return Length; }
char& operator [](int i);
private:
intLength;
char* Buff;
};
char& CharArray::operator [](int i)
{
staticchar ch = 0;
if(i<Length&&i>=0)
returnBuff[i];
else
{
cout<<"nIndexout of range.";
returnch;
}
}
voidmain()
{
intcnt;
CharArraystring1(6);
char* string2 = "string";
for(cnt=0;cnt<8; cnt++)
string1[cnt]= string2[cnt];
cout<<"n";
for(cnt=0;cnt<8; cnt++)
cout<<string1[cnt];
cout<<"n";
cout<<string1.GetLength()<<endl;
}
该数组类的优点如下:
(1)其大小不仅是一个常量。
(2)运行时动态指定大小可以不用运算符new和delete。
(3)当使用该类数组作函数参数时,不必分别传递数组变量本身及其大小,因为该对象中已经保存大小。
(4)最重要的是加上了数组越界检查。再也不会出现int*p=new int[1];滑稽问题。
p[3]=2;
cout<<p[3]<<endl;
--------------------------------------------------------------
数组是类型相同的对象的序列,其中的对象称为数组元素。也可以将数组想像成一连串的用下标值编号的相邻存储区。
可能在某些编程语言中,一个下标变量是不允许超出数组定义中所设的界限的。但是在C和C++中,数组是没有这种安全措施的。下面先来看看数组下标越界的几种异常结果。
例1,访问没有分配给数组的内存空间。
int main ()
{
const int SIZE = 4;
inta[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,访问数组的一个不存在的下标元素时无意中改变了一个变量的值。
intmain ()
{
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,由于数组下标太大而引起程序崩溃。
intmain ()
{
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++中数组元素下标越界可能引起的问题就说这么多吧,通过上面的例子,我们应该知道在使用数组时,要特别注意这个问题,因为它很可能会导致严重的后果。