malloc函数分配内存失败的原因及解决方法
原文链接: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函数分配内存失败的原因及解决方法相关推荐
- ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析解决方法
ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析解决方法 参考文章: (1)ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析解决方法 (2)ht ...
- java内存溢出原因及解决_java内存溢出的原因和解决方法
java内存溢出的原因和解决方法 发布时间:2020-06-15 17:57:39 来源:亿速云 阅读:85 作者:元一 内存溢出含义: 内存溢出(out of memory)通俗理解就是内存不够,通 ...
- ci框架中引入css,php ci框架中加载css和js文件失败的原因和解决方法
php ci框架中加载css和js文件失败的原因和解决方法 发布时间:2021-07-01 12:08:38 来源:亿速云 阅读:50 作者:chen 本篇内容介绍了"php ci框架中加载 ...
- python open找不到文件的原因_浅谈python在提示符下使用open打开文件失败的原因及解决方法...
题目:在提示符下使用open打开一个文件 刚开始网上看了下打开的方式,结果一直实现不了,报错是没找到这个文件,而且和我输入的文件名不一样. 错误如下: >>>open('d:\456 ...
- php大文件上传失败的原因及解决方法
php大文件上传失败的原因及解决方法 参考文章: (1)php大文件上传失败的原因及解决方法 (2)https://www.cnblogs.com/cxx8181602/p/9282576.html ...
- 进cf一直连接服务器失败怎么办,Win7玩穿越火线提示连接服务器失败的原因及解决方法...
穿越火线简称CF,是很多用户都喜欢玩的一款射击游戏,但是在Win7系统中运行穿越火线的时候,出现了连接服务器失败的情况,检查网络是正常的,也可以浏览网页,怎么会出现这种情况呢?经过分析,原因有很多,解 ...
- iphone 11显示连接服务器出现错误,iPhone11投屏方法有哪些?iPhone投屏失败的原因及解决方法...
对于iPhone投屏方法有些网友们并不了解,而且有些小伙伴出现了投屏失败的情况.为了让大家更好的了解iPhone投屏方法,智能手机网就为大家带来了iPhone投屏方法与失败解决方案的具体信息,一起来瞧 ...
- apmserv mysql5.1启动失败_apmserv启动失败的原因以及解决方法
在本地测试环境当中,很多人遇到过apmserv集成软件启动失败的问题:有apache启动失败.mysql启动失败:系统天堂小编针对apmserv启动失败的原因整理了对应的解决方法在这里分享给大家. 现 ...
- 为什么电子邮件发送失败?电子邮件发送失败的原因及解决方法
为什么电子邮件发送失败?电子邮件发送失败的原因及解决方法 作者:佚名 字体:[增加 减小] 来源:互联网 时间:11-17 15:50:23 我要评论 为什么电子邮件发送失败?某网友在线咨询了小编,小 ...
最新文章
- mysql 连接 查询 连表查询
- 理清 WebSocket 和 HTTP 的关系
- 网站运维技术与实践之服务器监测常用命令
- 牛客 - 街机争霸(bfs)
- App-V5.0服务器部署
- js里的数据类型转换
- OpenJDK8基础类库包清单
- 【计算机网络复习 数据链路层】3.6.5 PPP、HDLC
- node-glob学习
- 1加6投屏_6月的早餐,1杯牛奶加燕麦,营养健康又美味,饱腹感很强
- 使用SetUnhandledExceptionFilter()让程序优雅的崩溃
- 【转载】用备份进行Active Directory的灾难重建:Active Directory系列之三
- Unity3D射线检测
- hadoop权威指南 读书笔记
- 2048小游戏微信小程序源码
- MAC表、ARP表、IP路由表区别比较
- Java单例模式的双if
- 大白菜PE系统查看电脑开机密码教程
- 固定资产模块-12月末结账提示制单业务未完成
- 学人工智能以后从事什么工作?这6大就业方向前景广阔