#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;
}
解决方案 »
- wstring与cstring的选择,不进别后悔:)
- 关于ListCtrl控件的搜索问题 有代码 急!!!!
- 用spy和findwindowEX怎样才能找到资源管理器上comboBox的句柄?
- 收集最佳版主评选办法[李逍遥]
- 静态变量分配问题
- 求救啊:网络性能监测!谢谢!!!
- 如何程序方法实现未激活的程序激活,立即揭帖!
- ———奇怪的问题,请指教————
- 我用ATL做工程,注册表里为何没有服务器程序的接口,即CLSID和类型库?
- 请问?哪里有缩放图象原码?见内(有sourcecode)
- 当treectrl控件带有checkbox风格时,只勾中checkbox时发生的消息应该是哪一个
- 关于读文件,然后将里面的数据转为图片显示的问题
经过以下两句;
hPtr = header;
*hPtr++ = c;
实际上是在往一个错误的地方写数据,已经把堆破坏了.
所以你释放的时候就会崩溃,应该提示堆被破坏吧,不知道为什么会是提示越界,我还没看到C/c++编写的程序崩溃时提示越界的,也许是我没见过吧.
这句越界了,hPtr++的地址是m_body - 2,在分配内存区域之前两个字节,当然越界,
是的, 提示 heap corruption detected 错误......
代码header = m_body - 2;
hPtr = header;
*hPtr++ = c;
访问了分配内存之前的内存,破坏了堆,
指针越界是堆破坏的一种
header = m_body; //正常访问header = header - 2; //这样属于越界访问么?
char *m_body = (char *)malloc(iLen + 12); //多申请12字节
memset(m_body, 0 , iLen+ 12); //初始化
memcpy(m_body + 12, p, iLen); //内存拷贝 if (m_body)
{
header = m_body + 12 - 2; //有可能是减12
hend = m_body + 12;
}