malloc函数分配内存失败的原因及解决方法
2017-11-04 18:01
246 查看
原文链接:http://blog.csdn.net/lighthear/article/details/70146602
malloc函数分配内存失败的原因及解决方法
先说结论
malloc()函数分配内存失败的原因:
1. 内存不足。
2. 在前面的程序中出现了内存的越界访问,导致
malloc()分配函数所涉及的一些信息被破坏。下次再使用
malloc()函数申请内存就会失败,返回空指针
NULL(0)。
解决方法:
1.在STM32中堆空间内存不足的解决方法可以参考我上一篇文章
STM32分配堆栈空间不足问题原因及解决方法http://blog.csdn.net/lighthear/article/details/69485942
2.从不能分配的那个
malloc()函数开始,往回找最近的那个能分配的
malloc()函数,出问题的代码应该就在这部分,很可能的原因就是指针越界,对未知的内存进行了操作,导致了
malloc()不能继续分配内存。
遇到的问题
最近遇到STM32创建链表时,第一次运行正常,第二次无法正常创建的问题。在线调试发现是malloc()函数没有分配到内存,但是我之前已经调大过内存空间了,不应该存在小数据也内存不足的情况。
解决方法
刚开始以为是由于第一次运行后的释放内存操作没有正常执行,导致浪费过多内存空间产生内存不足,尝试了多种方式重写释放的函数,也查阅了free()函数的用法,证明使用方式正确。问题未解决
后来猜测由于指针变量释放后没有指向
NULL,造成了野指针的情况。但是所有指针变量均为局部变量,程序执行结束之后会自动释放,并不会对下次造成影响。问题未解决
查阅网上的资料发现,
malloc()内存分配失败的原因,除了内存不足,还可能是之前产生了内存指针越界。
malloc()函数分配内存失败的原因:
1. 内存不足。
2. 在前面的程序中出现了内存的越界访问,导致
malloc()分配函数所涉及的一些信息被破坏。下次再使用
malloc()函数申请内存就会失败,返回空指针
NULL(0)。
在这个思想指导下,往前逐个查找可能发生指针越界的函数
unsigned char * StrArray_ValArray(char *pStrArray) { int valArraySize = strlen(pStrArray) / 2; unsigned char *pValArray; pValArray = (unsigned char *)malloc(sizeof(unsigned char) * valArraySize); for (int i = 0; i < valArraySize; i++) { sscanf(pStrArray + i * 2 ,"%2x",(unsigned int *)(pValArray + i)); //强制类型转换造成指针越界 } }1
2
3
4
5
6
7
8
9
10
发现,声明的
pValArray为
unsigned char *类型的指针,由于
sscanf()的第三个参数提示需要
unsigned int *类型的变量,因此对
pValArray做了强制类型转换,从
unsigned char *变为了
unsigned int *。虽然对于
pValArray来说,内存空间没变(都为指针,32位系统分配4字节),但是对于编译器来说,所指向数据的含义就从
unsigned char扩大到了
unsigned int,之后通过指针遍历访问,对数组进行更改就会造成指针越界,更改到未分配的区域。因此下次再使用
malloc()函数申请内存就会失败,返回空指针
NULL(0)。
因此将干脆将
pValArray直接定义成
unsigned int *类型的变量,并按照
unsigned int类型分配空间,而不进行强制类型转换。这样就可避免指针越界的情况。测试发现问题不再发生。问题解决
总结
如果下一次再碰到这样的问题,就从不能分配的那个malloc()函数开始,往回找最近的那个能分配的
malloc()函数,出问题的代码应该就在这部分,很可能的原因就是指针越界,对未知的内存进行了操作,导致了
malloc()不能继续分配内存。
因此以后对指针的操作一定要万分小心,防止指针越界问题的发生。
参考文章:
1. malloc函数申请内存失败,返回空NULL(0):http://blog.csdn.net/gadflycq/article/details/40752373
2. 在内存充足时malloc函数分配内存失败的原因及解决:http://blog.sina.com.cn/s/blog_71d3b5480100lxcx.html
相关文章推荐
- malloc函数分配内存失败的原因及解决方法
- 在内存充足时malloc函数分配内存失败的原因及解决
- ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析解决方法
- Java heap space造成tomcat响应时间过长,原因在JVM内存分配太小,解决方法
- ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析解决方法
- ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析解决方法
- ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析解决方法
- 访问IIS元数据库失败 原因及解决方法
- Delphi分配或释放内存失败的原因
- 内存泄露的原因和解决方法
- 常见邮件发送失败原因分析以及解决方法
- SQL 2008 服务启动失败的原因和解决方法汇总。
- 添加Sql作业,新建步骤出现:从IClassFactory为CLSID为{AA40D1D6-CAEF-4A56-B9BB-D0D3DC976BA2}的COM组件创建实例失败,原因是出现以下错误:c001f011。的解决方法
- 宏晶STC单片机使用STC-ISP串口烧录失败的原因与解决方法汇总
- 用户登录失败。原因:未与信任 SQL Server 连接相关联”的解决方法
- 发现内存不能read和written的原因以及解决方法
- 电脑出现内存读写错误的原因和解决方法
- 检索 COM 类工厂中 CLSID 为{00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005。8000401A的错误解决方法
- Windows10安装失败且没有提示其他信息的故障原因及解决方法
- 关于安装网伦加密王失败的原因及解决方法