我正在尝试使用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位嵌入式处理器。
答案 0 :(得分:2)
这里有两件事:
malloc
需要一些空间来存储有关分配的内存块长度的元信息。通常它会在块返回之前存储并占用4个字节。
malloc
始终返回一个地址,该地址与平台的任何类型变量的最大对齐要求保持一致。通常,这是16字节或8字节对齐。来自malloc(3) man-page:
malloc()和calloc()函数返回一个指向已分配内存的指针,该内存适合任何内置类型。