如何在glibc库中找到malloc分配的chunk大小?

How to find the size of chunk allocated by malloc in the glibc library?

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  char * ptr1 = NULL;
  char * newptr = NULL;

  ptr1 = (char *) malloc(8 * sizeof(int));
  if (ptr1 == NULL)
    exit(EXIT_FAILURE);

  printf("%p\n", ptr1);

  newptr = ptr1 - sizeof(size_t);
  printf("%zu\n", (*(size_t *)newptr));
  free(ptr1);

  return 0;
}

输出:

0x...... [some address]
49

49 - 1 = 48 - (8 * 4) = 16

假设 sizeof(int) = 4

根据 glibc malloc() 实现,每个块的最大开销是 8 bytes

但是这个块字段的大小给出 48 减去可用内存给出 16。所以开销显示 16 bytes。 我知道出了点问题,但我无法弄清楚我在哪里做错了计算。

请帮忙。谢谢。

这是 implementation-defined 你不应该乱搞的东西之一,除了实验或研究目的。

在 GNU 平台中,non-C-standardheadermalloc.h 中存在一个名为 malloc_usable_size() 的函数,它将告诉您 [=12] 的实际 byte-length =]ed 堆块给出了一些指针,该指针是 malloc() 的 return 值,但在它自己的 documentation 中它说“虽然多余的字节可以被覆盖没有不良影响的应用程序,这不是好的编程习惯:分配中的多余字节数取决于底层实现。"

根据 C-standard,malloc() 分配的内存块只能保证您要求的字节数,但实际上大多数(如果不是全部)实现会给您一些额外的填充或内存管理器的目的。我记得我的一位计算机科学教授在她的系统上演示了如何在指针从 malloc() 传递之前查看内存,就像读取有关内存块的信息一样,但 C 编程语言确实如此不需要 malloc() 以这种方式实现,也不保证任何此类数据将如何编码。

您似乎使用的是 GNU,所以如果您想了解更多关于 malloc() 在您的平台上是如何实现的,请看一看 malloc_usable_size() 看看它是否真的给了您 48当您要求 32 字节时。为了记录,如果是这样,我一点也不会感到惊讶。

当你说 glibc 中的最大开销是 8 字节时,我不确定你指的是什么。这可能意味着堆管理器为每个块使用的最大内存为 8 字节,不包括为对齐分配的额外内存?