嵌入式系统中mallinfo的用法

时间:2016-03-18 10:49:56

标签: c arm malloc free 32-bit

我正在尝试使用mallinfo结构来打印通过malloc信息完成的堆使用..但是我无法在下面找到每个分配的完全匹配。

printMemoryInfo()
{
   struct mallinfo mi;
   memset(&mi,0,sizeof(struct mallinfo));
   mi = mallinfo();
   printf(" Heap Blocks = %d\n"mi.uordblks)
}


main()
{
  printf("Initial \n");
  printMemoryInfo();
  char * data = malloc(2); /* 2 bytes*/
  printf("After  Malloc 1");
  printMemoryInfo();
  free(data );
  data = malloc(3); /* 3 bytes*/
  printf("After  Malloc 2");
  printMemoryInfo();
  free(data );
  data = malloc(6); /* 6 bytes*/
  printf("After  Malloc 3");
  printMemoryInfo();
  free(data );
  data = malloc(10); /* 10 bytes*/
  printf("After  Malloc 4");
  printMemoryInfo();
  free(data );

}

Initial
Heap Blocks = 99128
After  Malloc 1
Heap Blocks = 99144
After  Malloc 2
Heap Blocks = 99144
After  Malloc 3
Heap Blocks = 99160
After  Malloc 4
Heap Blocks = 99160

从上面的打印日志中,我无法匹配其分配的数量 对于1个字节的第一次,它增加16并且即使我分配2或3也是相同的,如果我分配6个字节它将增加32并且即使对于10个字节分配它也将是相同的。

我需要帮助理解mallinfo,我正在研究32位嵌入式处理器。

1 个答案:

答案 0 :(得分:2)

这里有两件事:

  1. malloc需要一些空间来存储有关分配的内存块长度的元信息。通常它会在块返回之前存储并占用4个字节。

  2. malloc始终返回一个地址,该地址与平台的任何类型变量的最大对齐要求保持一致。通常,这是16字节或8字节对齐。来自malloc(3) man-page

  3.   

    malloc()和calloc()函数返回一个指向已分配内存的指针,该内存适合任何内置类型。