原文链接: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

发现,声明的pValArrayunsigned 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函数分配内存失败的原因及解决方法相关推荐

  1. ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析解决方法

    ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析解决方法 参考文章: (1)ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析解决方法 (2)ht ...

  2. java内存溢出原因及解决_java内存溢出的原因和解决方法

    java内存溢出的原因和解决方法 发布时间:2020-06-15 17:57:39 来源:亿速云 阅读:85 作者:元一 内存溢出含义: 内存溢出(out of memory)通俗理解就是内存不够,通 ...

  3. ci框架中引入css,php ci框架中加载css和js文件失败的原因和解决方法

    php ci框架中加载css和js文件失败的原因和解决方法 发布时间:2021-07-01 12:08:38 来源:亿速云 阅读:50 作者:chen 本篇内容介绍了"php ci框架中加载 ...

  4. python open找不到文件的原因_浅谈python在提示符下使用open打开文件失败的原因及解决方法...

    题目:在提示符下使用open打开一个文件 刚开始网上看了下打开的方式,结果一直实现不了,报错是没找到这个文件,而且和我输入的文件名不一样. 错误如下: >>>open('d:\456 ...

  5. php大文件上传失败的原因及解决方法

    php大文件上传失败的原因及解决方法 参考文章: (1)php大文件上传失败的原因及解决方法 (2)https://www.cnblogs.com/cxx8181602/p/9282576.html ...

  6. 进cf一直连接服务器失败怎么办,Win7玩穿越火线提示连接服务器失败的原因及解决方法...

    穿越火线简称CF,是很多用户都喜欢玩的一款射击游戏,但是在Win7系统中运行穿越火线的时候,出现了连接服务器失败的情况,检查网络是正常的,也可以浏览网页,怎么会出现这种情况呢?经过分析,原因有很多,解 ...

  7. iphone 11显示连接服务器出现错误,iPhone11投屏方法有哪些?iPhone投屏失败的原因及解决方法...

    对于iPhone投屏方法有些网友们并不了解,而且有些小伙伴出现了投屏失败的情况.为了让大家更好的了解iPhone投屏方法,智能手机网就为大家带来了iPhone投屏方法与失败解决方案的具体信息,一起来瞧 ...

  8. apmserv mysql5.1启动失败_apmserv启动失败的原因以及解决方法

    在本地测试环境当中,很多人遇到过apmserv集成软件启动失败的问题:有apache启动失败.mysql启动失败:系统天堂小编针对apmserv启动失败的原因整理了对应的解决方法在这里分享给大家. 现 ...

  9. 为什么电子邮件发送失败?电子邮件发送失败的原因及解决方法

    为什么电子邮件发送失败?电子邮件发送失败的原因及解决方法 作者:佚名 字体:[增加 减小] 来源:互联网 时间:11-17 15:50:23 我要评论 为什么电子邮件发送失败?某网友在线咨询了小编,小 ...

最新文章

  1. mysql 连接 查询 连表查询
  2. 理清 WebSocket 和 HTTP 的关系
  3. 网站运维技术与实践之服务器监测常用命令
  4. 牛客 - 街机争霸(bfs)
  5. App-V5.0服务器部署
  6. js里的数据类型转换
  7. OpenJDK8基础类库包清单
  8. 【计算机网络复习 数据链路层】3.6.5 PPP、HDLC
  9. node-glob学习
  10. 1加6投屏_6月的早餐,1杯牛奶加燕麦,营养健康又美味,饱腹感很强
  11. 使用SetUnhandledExceptionFilter()让程序优雅的崩溃
  12. 【转载】用备份进行Active Directory的灾难重建:Active Directory系列之三
  13. Unity3D射线检测
  14. hadoop权威指南 读书笔记
  15. 2048小游戏微信小程序源码
  16. MAC表、ARP表、IP路由表区别比较
  17. Java单例模式的双if
  18. 大白菜PE系统查看电脑开机密码教程
  19. 固定资产模块-12月末结账提示制单业务未完成
  20. 学人工智能以后从事什么工作?这6大就业方向前景广阔

热门文章

  1. Unity 技能范围指示器
  2. 【一文讲解深度学习】语言自然语言处理(NLP)第一篇
  3. python 数值型字符串实现四舍五入 decimal_Python将科学计数法数值转换为指定精度浮点数...
  4. 环境配置:前端程序员快速进行开发
  5. 一线PPT制作理论——简洁电磁环境构建
  6. 2.(cesium篇)cesium加载接入百度地图
  7. 刘强东的代码水平到底有多牛?网友:95年一个晚上赚5万
  8. 一个老站长说:我是如何通过网络赚来几百万?
  9. 财富自由:当你实现财富自由就无需为钱而工作!
  10. Java实验报告(6)