先说结论 malloc()
函数分配内存失败的原因:
1. 内存不足。
2. 在前面的程序中出现了内存的越界访问,导致malloc()
分配函数所涉及的一些信息被破坏。下次再使用malloc()
函数申请内存就会失败,返回空指针NULL(0)
。
解决方法:
1.在STM32中堆空间内存不足的解决方法可以参考我上一篇文章
STM32分配堆栈空间不足问题原因及解决方法 http://blog.csdn.net/lighthear/article/details/694859422.从不能分配的那个
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
【C语言|malloc函数分配内存失败的原因及解决方法】转载地址: http://blog.csdn.net/lighthear/article/details/70146602
推荐阅读
- 算法刷题|LeetCode刷题笔记-21.合并两个有序链表
- 安全|第一篇关于我的个人博客--与诸君共勉
- C语言程序练习|交换最小值和最大值
- 麦克算法|第12节课 图
- 寒假刷题特辑|【第五章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】
- linux|ubuntu20.04安装微信和QQ,腾讯会议,以及一些其他实用软件
- 《“深入浅出”数据结构》|链表OJ经典题浅刷< 1 >(看完不再害怕链表题)
- 蓝桥杯单片机|蓝桥杯单片机-DAC-用板载板载PCF8591芯片在D/A引脚上输出指定的电压
- 蓝桥杯单片机|蓝桥杯单片机-ADC-A/D转换-测量PCF8591中AIN1通道(光敏电阻RD1)的电压