c - 动态内存分配硬故障问题
问题描述
我正在为某些以太网进程使用 stm32f4 微处理器和 lwip 库。
我有动态内存分配的问题。由于某种原因,当我向我的硬件发送 ping 时,该设备在 1 小时后遇到了 Hardfault 问题。
这些是我的固件程序main.c
while(1)
{
uint8_t * incomingData = ethernetif_input(&gnetif);
if(incomingData != NULL)
{
if(incomingData[0] == 0x01)
{
// doing some process
}
incomingData = NULL;
free(incomingData)
}
}
在ethernetif.c
:
uint8_t * ethernetif_input(struct netif *netif)
{
struct pbuf *p;
p = low_level_input(netif);
if (p == NULL) {
return NULL;
}
uint8_t * data = (uint8_t*)(malloc(sizeof( uint8_t) * 61U));
if ((memcmp (p->payload, EXPECTED_ETHERNET_FRAME, 6) == 0))
{
for(int i = 0; i < 61; i++)
{
data[i]=(((uint8_t*)p->payload)[i]);
}
}
else
{
err = netif->input(p, netif);
data = NULL;
free(data);
if (err != ERR_OK)
{
pbuf_free(p);
p = NULL;
}
{
if(p != NULL)
{
pbufFreeErr = pbuf_free(p);
if( !(_Bool)pbufFreeErr)
{
}
}
return data;
}
解决方案
你的内存不足了。
正如评论中已经提到的:data=NULL; free(data)
没有意义。它说忘记数据指向的内容,然后什么也不做。您应该先将free(data)
其设置为 NULL。这将使指向的内存data
可供将来的malloc
调用使用。
而且您还应该pbuf_free
在所有情况下调用,如果不这样做,您将耗尽内存。
最后一点,不要使用 for 循环来复制缓冲区,使用memcpy
.