没听说越界要报错呀,这是怎么回事?为什么会报错?

telnet2008 2007-03-02 02:34:37
#include string.h

int main()
{

char * pChar = new char(32);
strcpy(pChar, "A");//改为*pChar = 'A';就不会报错了
delete pChar;
pCharArray = NULL;

return 0;

//vs2003 下编译无错,运行报错:DANGE after Normal block(#40) at x003707A0
}


自己的一点分析:

出错是因为strcpy(pChar, "A"); 对pChar做了字符串操作,而pChar实际是字符指针,而非字符串指针,导致pChar越界。

但没听说越界要报错呀,这是怎么回事?为什么会报错?
...全文
443 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
telnet2008 2007-03-02
  • 打赏
  • 举报
回复
谢谢各位
awl005 2007-03-02
  • 打赏
  • 举报
回复
对于数组越界不报错指的是编译期而不是运行期
FreshBird 2007-03-02
  • 打赏
  • 举报
回复
vs2003下,在char * pChar = new char(32)设置断点,单步调试,在调试环境中的"内存窗口"中发现,pChar new了之后,pChar所指地址和它前后几个字节的内容都发生了改变(如果晓得发生改变的机理请告诉我),也就是程序已经预定了这些地址,"A"相当于 'A'+'\0','A'占用pChar所指这个地址,'\0'占用了pChar+1所指这个地址.

为什么会报错呢?

=====================================================
new返回给你的指针所指向的地址前后都有Cookie(就是你所看到的"pChar所指地址和它前后几个字节的内容都发生了改变"), 系统就是用这些Cookie字节来标记你所申请的内存相关信息以及用它来检查你是是否越界访问的.
你上面的代码在strcpy的时候破坏了你所申请的内存块后面的Cookie标记, 所以delete的时候系统知道你越界了并报错.

这个在侯捷老师的<<池内春秋>>一文中有讲解.

另外在Debug模式下调试器还会加额外的Cookie来检查.好像在<<深入浅出MFC>>中的有个地方讲过, 具体记不清了.
Cocoky 2007-03-02
  • 打赏
  • 举报
回复
无语!!
0黄瓜0 2007-03-02
  • 打赏
  • 举报
回复
报错是因为VS的DEBUG版本对动态内存会设置边界检查.超过边界的那4个字节是一个特殊值,当delete时会检查这个特殊值.如果已改写就会报错.

这样不会出错可以看出我上面的结论.
int main()
{

char * pChar = new char(32);
long int x=*(int*)(pChar+1);//改变边界之前保存这个边界值
strcpy(pChar, "ABCD");//

*(int*)(pChar+1)=x;//delete之前恢复这个特殊值
delete pChar;
pChar= NULL;

return 0;
}
telnet2008 2007-03-02
  • 打赏
  • 举报
回复
谢谢各位参加讨论
taodm 2007-03-02
  • 打赏
  • 举报
回复
具体?那么你就上调试器,跟踪一下就知道了。
telnet2008 2007-03-02
  • 打赏
  • 举报
回复
当你delete时,释放不是你自己申请的内存
-----------dic_walter(c-type blood)

我释放的是pChar,又不是pChar+1,为什么释放不了?
telnet2008 2007-03-02
  • 打赏
  • 举报
回复
越界操作损坏了vs维护的一些数据结构
---------fflush(stdin)

一些什么数据结构,能具体一点吗?
telnet2008 2007-03-02
  • 打赏
  • 举报
回复
希望能有更详细,更具体的解释,

比较宏观的解释,对能力也没多大提高,您说是吧.

fflush 2007-03-02
  • 打赏
  • 举报
回复
debug下会报错是因为vs捕获到了越界访问,你可以认为是在你new的时候vs对申请的内存块的边界作了一些标记,一旦出现访问这些标记的动机,就认为是越界了。上述代码在Release下依旧报错,这个是由于越界操作损坏了vs维护的一些数据结构,导致delete失败,当然,去掉delete那句,程序可以“顺利”返回
dic_walter 2007-03-02
  • 打赏
  • 举报
回复
哦,有点问题
copy后,内存就越界了,当你delete时,释放不是你自己申请的内存,当然会报错了
dic_walter 2007-03-02
  • 打赏
  • 举报
回复
char * pChar = new char(32); 只是new1个字节长度的char,值是32
char * pChar = new char[32]; 是new了32个字节长度。
所以你在copy后,再delete时,内存就越界了,当然会报错。
unhappyless 2007-03-02
  • 打赏
  • 举报
回复
谁说越界不报错?!

char * pChar = new char(32); //没有写错

你知道这什么意思吗? 你就申请了1个字节空间,你要放两个进去,能不出错吗!
wasoxi 2007-03-02
  • 打赏
  • 举报
回复
有錯當然要報錯了
telnet2008 2007-03-02
  • 打赏
  • 举报
回复
char * pChar = new char(32); //没有写错

vs2003下,在char * pChar = new char(32)设置断点,单步调试,在调试环境中的"内存窗口"中发现,pChar new了之后,pChar所指地址和它前后几个字节的内容都发生了改变(如果晓得发生改变的机理请告诉我),也就是程序已经预定了这些地址,"A"相当于'A'+'\0','A'占用pChar所指这个地址,'\0'占用了pChar+1所指这个地址.

为什么会报错呢?
taodm 2007-03-02
  • 打赏
  • 举报
回复
谁告诉你越界就一定不报错了?
FingerStyle 2007-03-02
  • 打赏
  • 举报
回复
char * pChar = new char[32];
===============

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧