内存访问越界(转)

原创 2011年01月08日 13:10:00

1. 原理分析
经常有些新C++程序员问:C++的类的成员个数是不是有限制,为什么我加一个变量后程序就死了?或者说:是不是成员变量的顺序很重要,为什么我两个成员变量顺序换一换程序就不行了?凡此种种之怪现象,往往都是内存访问越界所致。

何谓内存访问越界,简单的说,你向系统申请了一块内存,在使用这块内存的时候,超出了你申请的范围。例如,你明明申请的是100字节的空间,但是你由于某种原因写入了120字节,这就是内存访问越界。内存访问越界的后果是:你的写入破坏了本不属于你的空间。

下面是一个简单的例子:
int a;
char b[16]="abcd";
int c;

a = 1;
c = 2;
printf("a=%d,c=%d/n", a,c);
memset(b, 0,32); //注意这里访问越界了,你只有16字节空间,却修改了32字节
printf("a=%d,c=%d/n", a,c);

你可以看出,在memset前后,两个printf语句打印出来的值并不一样,因为memset越界后修改了a或者c的值(由于不同编译器对变量在空间中顺序的安排可能有不同策略,因此我用两个变量,希望能抓到越界信息。对于VC,debug模式下系统添加了很多填充字节,你可能需要增加越界的数量才能看到效果)


2. 为什么增加一个变量后程序就崩溃了?
增加一个变量后,内存中变量的布局也发生了变化。如果一个内存越界破坏了一个不含指针的结构,程序虽然逻辑不对,但是不至于崩溃。但是如果增加变量后,内存访问越界破坏了一个指针,则会导致程序崩溃。

例如:

int a;
char b[128];
//bool c;
char* d=new char[128];
int e;

b[136] = '/0';
b[137] = '/0';
b[138] = '/0';
b[139] = '/0';
strcpy(d, "haha");
注意, b访问越界了8个字节位置处的4个字节。如果没有c,那么越界破坏了e变量,不会导致程序崩溃。但是加上c之后,破坏的变量可能就是d了,由于指针被破坏后,一旦访问就是内存访问违例,导致程序崩溃。

这也解释了为什么交换顺序会导致程序崩溃。如果上面情况没有变量c,你交换e和d,结构也是类似的,程序也一样要崩溃。

3. 为什么有些情况越界了程序也没错?
这主要是说这个话的人对什么是“错”没有正确的认识。程序不是只有崩溃了才是错!你破坏了别的变量,那个变量总有被使用的时候,尽管那个变量不会导致诸如程序崩溃、报警之类的严重错误,但是其计算结果必然是错误的。你说“程序没错”,是因为你根本没有发现错误而已。这种情况甚至比程序直接崩溃还要恶劣,因为程序一旦崩溃你肯定会去查,可以在导致真正严重的问题之前就把问题解决了。而如果计算错误隐藏到很晚,你的损失就可能很大了。(例如,一颗卫星上天了,你才发现一台仪器由于软件故障无法测量真正的数据,那得多少损失?)

4. 如何解决内存访问越界问题?
老实说没有好的方法。遇到这种问题,首先你得找到哪里有内存访问越界,而一个比较麻烦得问题在于,出现错误得地方往往不是真正内存越界得地方。对于内存访问越界,往往需要进行仔细得代码走查、单步跟踪并观察变量以及在调试环境得帮助下对变量进行写入跟踪(如VC6就有一旦变量被修改就break得机制)。

更重要得是,程序员要养成良好的编程习惯,在修改每个数组时一定要对这个数组有多少空间有清醒的认识,否则一旦出错,找到原因是很痛苦的事情。

 

内存越界访问

内存越界访问有两种:一种是读越界,即读了不属于自己的数据,如果所读的内存地址是无效的,程度立刻就崩溃了。如果所读内存地址是有效的,在读的时候不会出问题,但由于读到的数据是随机的,它会产生不可预料的后果...
  • Andeewu
  • Andeewu
  • 2013年12月13日 11:25
  • 1262

【转】内存访问越界

1. 原理分析经常有些新C++程序员问:C++的类的成员个数是不是有限制,为什么我加一个变量后程序就死了?或者说:是不是成员变量的顺序很重要,为什么我两个成员变量顺序换一换程序就不行了?凡此种种之怪现...
  • jo_say
  • jo_say
  • 2010年06月21日 00:09
  • 1214

对于内存越界访问的笔记

对于内存访问越界的操作在编译时期编译器是不会报错的,而在
  • u010110208
  • u010110208
  • 2014年07月06日 15:54
  • 1010

关于C++内存越界访问的问题

今天是第一天写博客,哈哈,想想还有点激动,啦啦。 言归正传啊,今天主要是说C基础里的strcat函数,它的意思主要是进行字符的拼接,例如: 来自http://blog.csdn.net/cnc...
  • l494926429
  • l494926429
  • 2015年11月12日 10:18
  • 724

为什么不能越界访问malloc分配的内存

写在前面:小生纯业余选手,开此博仅仅是为了积累,纯当笔记来用。如有看官光临小生博客,请不要相信我的代码就是正确的。如果您发现了错误也恳请耽误您一点时间,请您在下面指出来,不胜感激! 如果发现...
  • glianyi
  • glianyi
  • 2014年07月04日 14:15
  • 746

c++ 很隐蔽的指针访问越界的情况---在强制类型转换中发生

template void Mat::Read(char *ImageName) //从硬盘文件中读入图像数据; { IplImage *img =cvLoadImage( ImageName ,...
  • wonengguwozai
  • wonengguwozai
  • 2016年08月17日 21:11
  • 651

c++关于越界访问(内存溢出)

越界访问指访问了不是程序申请的内存区域
  • lcfeng1982
  • lcfeng1982
  • 2014年11月13日 09:26
  • 3280

C/C++常见指针错误 and 内存访问越界

1) 内存分配未成功,却使用了它。    编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。常用解决办法是,在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入...
  • aidem_brown
  • aidem_brown
  • 2015年11月12日 10:10
  • 2503

Malloc内存泄露和内存越界问题的研究

Malloc内存泄露和内存越界问题的研究 2013-03-02 22:59:32 分类: LINUX 原文地址:Malloc内存泄露和内存越界问题的研究 作者:gongcb Ma...
  • u011761947
  • u011761947
  • 2013年10月22日 11:11
  • 1202

内存访问越界问题

转:http://blog.vckbase.com/arong/archive/2009/12/30/40598.html1. 原理分析经常有些新C++程序员问:C++的类的成员个数是不是有限制,为什...
  • zhuxiaoyang2000
  • zhuxiaoyang2000
  • 2011年04月19日 20:43
  • 487
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:内存访问越界(转)
举报原因:
原因补充:

(最多只允许输入30个字)