Malloc标题内容

Bru*_*uce 6 c malloc

因此在大多数实现中,malloc在分配的内存之前存储一个标头,以跟踪分配的内存大小(以便它可以执行free和recalloc).标题内容是什么?

我写了一个天真的代码来找到它,但它没有任何意义

int * ptr;
ptr = malloc(12*sizeof(int));
printf("Header = %d\n",*(ptr-1));
Run Code Online (Sandbox Code Playgroud)

它回来了

Header = 57
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

Mic*_*hel 15

我猜你想学习并看看内存是如何分配的.我会忽略未定义的行为答案.当你谈到可移植性等时,它们是正确的(当然),但这不是你的问题.我认为尝试找出分配方式是一个非常好的主意.

首先,我建议您开始查看适用于您平台的malloc实现.如果该代码不可用,那么您运气不佳,您唯一可以做的就是谷歌了解分配是如何完成的.

如果你运行linux,你可以看一下glibc或uclibc的malloc实现.这里是uclibc实现的链接:http://git.uclibc.org/uClibc/tree/libc/stdlib/malloc/malloc.c 代码有很多注释,但可能会让人 不知所措.

有关您的问题,请查看第104行的http://git.uclibc.org/uClibc/tree/libc/stdlib/malloc/malloc.h.这是您正在谈论的部分.您会看到布局取决于MALLOC_HEADER_SIZE,它可能因不同系统而异.通过阅读代码,您可以了解要使用的类型,以及存储内存大小的偏移量(在此特定实现中)

当然,上面只是uclibc的一个示例实现,可以帮助您入门...


小智 6

没人真正回答数字"57"的来源,所以这是我对它的理解.

使用malloc或calloc时设置的标头,至少在我使用的体系结构上,是运行时堆上内存块的总大小,加上一些"布尔标志".

你要求12个整数,每个int(大概)是4个字节.12x4 = 48.对于标题块本身(数字57),另外4个字节被添加到此计数中,使我们保持在52.
那么为什么你得到57?

好吧,Malloc和Calloc仅以8位块请求内存,以避免总线错误.8的下一个更高倍数是56.

现在,回想一下,任何可被8整除的数字都有一个二进制表示,总是以三个0结尾.作为C的内存保存语言,编译器利用这一事实并使用最后三个0作为布尔标志.

在这种特定情况下,设置最后一个布尔标志,加1到56,当读作int时产生数字57.