|
这两天调试一个嵌入式系统程序
一直受到malloc调用时出现段错误的困扰,百思不得其解
想着malloc这样的函数,从c语言出世那天就有了,应该不会出现这种bug
开始以为可能是pthread库引起的,因为程序里开了好几个线程,结果一一排除
郁闷了好几天。
后来发现在我在调用inet_ntoa()时,写了如下代码
char *buf=inet_ntoa();
...
if(buf)
free(buf);
inet_ntoa()的man文档中,写了一句,它返回的字符串指针是静态分配的内存
我却调了free()函数
但是free()并不报告失败,而是在你紧接着下次调用malloc时报告段错误。
分析了一下,想是可能因为,free并不检查释放的是否是动态分配的内存还是静态分配的内存,它直接把传过来的地址,挂到堆链上了,下次malloc调用时,发现这个地址是只读的,结果出现段违例
大家不相信,可以free一下自己static定义的内存,紧接着malloc一下 |
|