malloc函数分配内存失败的原因及解决⽅法
malloc函数分配内存失败的原因及解决⽅法
先说结论
malloc()函数分配内存失败的原因:
1. 内存不⾜。
2. 在前⾯的程序中出现了内存的越界访问,导致malloc()分配函数所涉及的⼀些信息被破坏。下次再使⽤malloc()函数申请内存就会失败,返回空指针NULL(0)。
解决⽅法:
1.在STM32中堆空间内存不⾜的解决⽅法可以参考我上⼀篇⽂章
2.从不能分配的那个malloc()函数开始,往回最近的那个能分配的malloc()函数,出问题的代码应该就在这部分,很可能的原因就是指针越界,对未知的内存进⾏了操作,导致了malloc()不能继续分配内存。
遇到的问题
最近遇到STM32创建链表时,第⼀次运⾏正常,第⼆次⽆法正常创建的问题。在线调试发现是malloc()函数没有分配到内存,但是我之前已经调⼤过内存空间了,不应该存在⼩数据也内存不⾜的情况。
解决⽅法
刚开始以为是由于第⼀次运⾏后的释放内存操作没有正常执⾏,导致浪费过多内存空间产⽣内存不⾜,尝试了多种⽅式重写释放的函数,也查阅了free()函数的⽤法,证明使⽤⽅式正确。问题未解决
后来猜测由于指针变量释放后没有指向NULL,造成了野指针的情况。但是所有指针变量均为局部变量,程序执⾏结束之后会⾃动释放,并不会对下次造成影响。问题未解决
查阅⽹上的资料发现,malloc()内存分配失败的原因,除了内存不⾜,还可能是之前产⽣了内存指针越界。
molloc函数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)); //强制类型转换造成指针越界
}
}
发现,声明的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()不能继续分配内存。
因此以后对指针的操作⼀定要万分⼩⼼,防⽌指针越界问题的发⽣。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论