c++对数组越界不进行检查 c 判断数组是否越界

 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)
{
c++对数组越界不进行检查 c 判断数组是否越界
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++中数组元素下标越界可能引起的问题就说这么多吧,通过上面的例子,我们应该知道在使用数组时,要特别注意这个问题,因为它很可能会导致严重的后果。

  

爱华网本文地址 » http://www.aihuau.com/a/25101013/184842.html

更多阅读

dnf不死鸟武器+15换镇魂是否值得 dnf镇魂武器值得做吗

? ?? ???dnf游戏中+15的不死鸟武器固然十分强大,这条快速获得高强武器的方法并不适用于绝大多数玩家,究竟把+15不死鸟武器换镇魂是否值得?在发下2把武器的属性? ??? ??两种武器的属性对比,主要体现在基础攻击力、无视攻击力以及附

制冰机不制冰故障判断 家用制冰机

制冰机不制冰故障判断——简介制冰机不制冰了 怎样判断是什么地方出问题了制冷系统发生了故障,一般不可能直接看到故障的部位发生在哪里,也不可能将制冷系统的部件一一分解和解剖,只能从外表检查,找出运行中的反常现象,进行综合分析。在

早产儿是不是脑瘫如何判断? 早产儿脑瘫发病率

早产儿是不是脑瘫如何判断?? ? 早产儿脑瘫表现有以下4大特点:??? 1、运动落后和主动运动减少:正常小儿3个月时俯卧位时会抬头,仰卧位时有踢腿动作,而脑瘫患儿很少有这些动作。??? 2、反射异常:正常小儿头部位置忽然放低有拥抱反射(如惊吓

C#的动态数组 c 动态数组的用法

在使用数组的过程中,有时候希望数组的长度和元素个数能随程序的运行不断改变,但改变一次就要重新开辟一个新的数组对象,这样将占用内存空间。为了解决这个问题,Microsoft.NET Framework 体统了一个ArrayList类,专门用于处理可按动态增减

实务 缓刑犯都不构成累犯吗? 缓刑是否构成累犯

缓刑考验期满后,原判刑罚就不再执行了,而不是刑罚已经执行完毕,故不符合累犯的成立条件。但通说的观点和实践的做法均值得反思和商榷。文 | 陈鹏展 吴情树来源 |吴情树博士的法律博客我国刑法规定的累犯,可分为一般累犯和特别累犯。根据

声明:《c++对数组越界不进行检查 c 判断数组是否越界》为网友妩媚男神分享!如侵犯到您的合法权益请联系我们删除