【发布时间】:2020-09-17 14:32:46
【问题描述】:
我试图了解 glibc 的 malloc 究竟是如何在我的 64 位机器上记账的。
根据文档,它在块之前存储实际大小(malloc 值加上簿记字节)。于是我从here中获取了以下代码:
int *a = (int *) malloc(4);
int *b = (int *) malloc(7);
int *c = (int *) malloc(1);
int *d = (int *) malloc(32);
int *e = (int *) malloc(4);
printf("0x%x\n", a);
printf("0x%x\n", b);
printf("0x%x\n", c);
printf("0x%x\n", d);
printf("0x%x\n", e);
printf("a[-1] = %d, a[-2] = %d\n", a[-1], a[-2]);
printf("b[-1] = %d, b[-2] = %d\n", b[-1], b[-2]);
printf("c[-1] = %d, c[-2] = %d\n", c[-1], c[-2]);
printf("d[-1] = %d, d[-2] = %d\n", d[-1], d[-2]);
printf("e[-1] = %d, e[-2] = %d\n", e[-1], e[-2]);
产生:
0xfca042a0
0xfca042c0
0xfca042e0
0xfca04300
0xfca04330
a[-1] = 0, a[-2] = 33 // letter[-2] is how much memory malloc has actually allocated
b[-1] = 0, b[-2] = 33
c[-1] = 0, c[-2] = 33
d[-1] = 0, d[-2] = 49
e[-1] = 0, e[-2] = 33
所以你可以看到前三个地址相隔 32 字节,这是有道理的,因为 malloc 分配的最小块是 32 或者更确切地说是4 * sizeof(void*)。但是,当我分配 32 字节时,下一个块是 48 字节而不是 64 字节,这是为什么呢?
如果 malloc 分配了 32 和 48 字节,为什么它分别打印 33 和 49?
【问题讨论】:
-
幸好 open source 有 很多 cmets。
标签: c memory-management malloc glibc