调用malloc()会覆盖静态表

时间:2014-01-16 15:44:35

标签: c pointers memory-management malloc stm32

我正在使用STM32F4微控制器内的ARM Cortex M4F(M3),没有操作系统。语言是纯粹的C.

我遇到malloc()函数的问题。下面的代码使用从SD卡读取的全局和易失性数据表(volatile unsigned char [] fat_sector_buffer)。在函数中,我正在声明指针内存(用于从表中读取数据的结构类型作为结构),并将内存分配为从RTC保存日期和时间的第二个结构。

问题是,当我使用malloc()时,内存是在fat_sector_buffer上分配的。

代码:

unsigned char fat16_update_entry()
{
uint8_t looking=1;
unsigned int i=0;
char ret=0;
Fat16Entry *data;   
DateTimeStruct *dt=malloc(sizeof(DateTimeStruct));
unsigned short time,date;
dt= read_calendar(dt); //Read calendar date and time
    ...

我在malloc之后获得的是: http://i.stack.imgur.com/Lv0Mn.png

为什么会这样,我该如何解决?

2 个答案:

答案 0 :(得分:0)

帖子没有说明fat_sector_buffer指向的内存是如何分配的,它有多大,或者它是如何填充的。很难说它是否真的被写了。

malloc实际上并没有向它分配的内存写任何内容。只需保留它并提供指针。

答案 1 :(得分:0)

基于上述问题的答案(您确保fat_sector_write_buf已静态分配且足够大),我猜您的堆已损坏。有些事情告诉堆管理器,有可用的内存要分配在fat_sector_write_buf内,这就是malloc()返回它的原因。我猜想有些东西会覆盖堆上的指针。很遗憾你不能使用valgrind,因为这会很快找到它。

因此,您需要调试覆盖堆的任何内容。您的libc可能会提供一些堆/ malloc调试,例如: http://www.gnu.org/software/libc/manual/html_node/Allocation-Debugging.html#Allocation-Debugging 虽然这将取决于您的libc构建。您可以(通过检查libc的源代码)确定堆是如何工作的,并调用一些东西来检查(紧接在malloc之前),虚假块实际上在堆上。您也可以使用远程调试逐步执行malloc()并找出返回虚假值的原因。显然这将取决于您的平台。

作为另一种可能性,您可能只是内存泄漏并且内存不足。通常堆栈会向下扩展并且堆会增长,因此超大堆栈或堆命中的第一件事是另一件事。但是,在嵌入式平台上,它可能会打击静态数据。