首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

释放指针,提示越界异常!

2012-03-21 
释放指针,提示越界错误!!!C/C++ code#include windows.h#include stdio.h//测试函数void testFun(char

释放指针,提示越界错误!!!

C/C++ code
#include <windows.h>#include <stdio.h>//测试函数void testFun(char *p, int iLen){ char *hPtr; char *header; char *hend; char c; int iChannel = 0x03; char *m_body = (char *)malloc(1024); memset(m_body, 0 , 1024); memcpy(m_body, p, iLen); //内存拷贝 if (m_body) {  header = m_body - 2;  hend = m_body; } else {  return; } c |=  iChannel; hPtr = header;  /*  在这里释放不会出错  if (m_body)  {  free(m_body);   m_body = NULL;  }  */  *hPtr++ = c;  if (m_body)  {   //释放指针,提示越界错误!!!   free(m_body);    m_body = NULL;  }}//主函数int main(){ char *p = (char *)malloc(1024); memset(p, 0 , 1024); memcpy(p, "test", strlen("test")); testFun(p, strlen("test")); //调用函数  if (p)  {  free(p);  p = NULL; }  system("pause"); return 0;}


[解决办法]
*hPtr++ = c;这里越界访问了
[解决办法]
header = m_body - 2;这里已经把指针指向了一个错误的地方了(越界了);
经过以下两句;
hPtr = header;
*hPtr++ = c;
实际上是在往一个错误的地方写数据,已经把堆破坏了.
所以你释放的时候就会崩溃,应该提示堆被破坏吧,不知道为什么会是提示越界,我还没看到C/c++编写的程序崩溃时提示越界的,也许是我没见过吧.
[解决办法]
*hPtr++ = c;
这句越界了,hPtr++的地址是m_body - 2,在分配内存区域之前两个字节,当然越界,
[解决办法]
debug版本会提示越界,堆破坏也是越界的一种表现,vc的debug版本会在分配区之前和之后写入标志,然后检查这些标志是否被错误写入,

探讨

header = m_body - 2;这里已经把指针指向了一个错误的地方了(越界了);
经过以下两句;
hPtr = header;
*hPtr++ = c;
实际上是在往一个错误的地方写数据,已经把堆破坏了.
所以你释放的时候就会崩溃,应该提示堆被破坏吧,不知道为什么会是提示越界,我还没看到C/c++编写的程序崩溃时提示越界的,也许是我没见过吧.

[解决办法]
你修改的不是字符串常量,而是m_body - 2的内存地址,这是在你分配的内存之前两个字节,

探讨

引用:
*hPtr++ = c;这里越界访问了

=============
开源程序中, 有这段代码, 是不是因为字符串常量不允许修改的原因...

[解决办法]
那个-2比较坏
[解决办法]
很显然
代码header = m_body - 2;
hPtr = header;
*hPtr++ = c;
访问了分配内存之前的内存,破坏了堆,
指针越界是堆破坏的一种

热点排行