首页 文章

调用malloc()会覆盖静态表

提问于
浏览
0

我正在使用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

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

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

  • 0

    基于上述问题的答案(你确保 fat_sector_write_buf 是静态分配的并且足够大),我猜你有一个损坏的堆 . 有些事情告诉堆管理器,有可用的内存要分配在 fat_sector_write_buf 内,这就是为什么 malloc() 正在返回它 . 我猜想有些东西会覆盖堆上的指针 . 它's a pity you can' t使用 valgrind ,因为这会很快找到它 .

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

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

相关问题