1.现象描述
Visual C++ 6.0运行一段程序,报错:debug errror damage :after normal block at(堆损坏了)。网上查了一下,说是内存访问越界。Debug模式下,点击忽略还能继续执行。
下面,我将通过断点调试找到出错的语句,并定位出原因。
2.定位解决
1.首先,可以通过加printf打印,缩小问题范围,初步怀疑到那段代码有Bug
2.通过缩小范围,定位在问题出在hexStringToCRC16函数,加断点,断点调试
3.断点调试,调试到free释放内存的时候,报错了。
4.思考报错的原因:
4.1.可能指针data的值已经被该拜年了。malloc申请一块内存控制,指针data就指向了这段内存空间,而后面在运算的时候,如果data指针做了操作,使得指针指向的地址已经发生了变化,所以free变化之后的种子很就会报错。修改方法:用个临时变量来记录data指针的初值,然后再free. 参考关于malloc之后free函数报错的问题
4.2.如果是结构体,尤其注意内存对齐访问的问题。可参考c中free函数报错,显示堆损坏
4.3.需要用的内存,大于申请的内存,导致写入越界了,在free的时候,报堆损坏。而本案例就是这个原因导致的。修改,把申请的data的长度给增大了。参考 用free()释放malloc申请的内存时出现堆损坏