“return HeapAlloc(_crtheap, 0, size ? size : 1); 的问题

        在写程序时遇到了一个问题,具体出错点出现在:


     在进行这个程序时,当处于调试状态即使不设置断点,程序也可以完成的很好,但是当运行程序时,总是会报错,在报错处点击调试,进入到调试状态,此时程序显示:


这个地方很熟悉,错误来源也很多,可能是由于空指针,也有可能是堆栈静态分配内存太大的缘故,这里可以利用调试技术中的调用堆栈技术,因为此时,程序将会运行到库函数的malloc.c 的这个函数处:


甚至还会显示无法调用崩溃进程,通过调用堆栈,发现程序正是在大致


L1处停止的,经过分析,查阅资料,发现这是动态分配内存的一个重要的地方,经过仔细观察,发现原因是在分配好L2的内存时,将会申请一个堆,此后建立的都将建在这个堆上,这时候当运行到分配L1的内存时发现它们的地址只相差了4个小单位,由于各自的队应当是独立的,所以应当为L1,L2申请大一点的内存用sizeof表示!!!!,特别是L2,因为它在前!!!!改后的代码为:

L2=(RESlist)malloc(1000*sizeof(RESlist));		
L2->next_node=NULL;			

L1=(SERnode)malloc(1000*sizeof(SERnode));		
L1->next_node=NULL;								
						

由于数据处理样本比较大,所以这里分配了较大的空间:)

经测试,程序可以运行,不再发生报错。

这里还想说一些通过编写这个程序了解到的一些东西,有些知识还需要以后慢慢消化吧。

首先,进程的问题,内存泄漏,无用指针的问题。

编写程序时,总会有些判断的==写成了=号,浪费了很多时间。

其次,还有最后,当执行完函数主体,不管有没有return 0,此时都会进入到一个判断的库函数中,开始,还以为是这里导致了程序不能运行,实际上,这里是一个知识点,即不管是void main,还是 int main,最后都强制返回一个0,这个库函数即判断程序是否自返回0,否则将会添加0,并返回!!

以上为个人理解,可能有关概念还是不够准确吧。


 
 

猜你喜欢

转载自blog.csdn.net/T2777/article/details/80557295