glibc(GNU C 库)是否提供了一种获取已分配内存块大小的方法?

Does glibc (GNU C Library) provide a way to obtain the size of an allocated memory block?

我有一个指针。我知道它的地址(我得到了一个函数的参数),我知道它指向一个先前由 malloc() 调用分配的内存地址。

有没有办法知道这个分配的内存块的大小?

我更喜欢跨平台的标准解决方案,但我认为这些都不存在。因此,任何事情都可以,即使是硬核低级 malloc 数据结构操作,如果没有更好的话。我将 glibc 与 x86_64 体系结构一起使用,并且没有计划在其他地方 运行 结果。 我不是在寻找通用答案,它可以特定于 glibc/x86_64。

我想,这个信息应该是可用的,否则realloc()无法工作。


This question 要求一个通用的、符合标准的解决方案,这是不可能的。我正在寻找一个可能的 glibc/x86_64 解决方案,因为 glibc 是开源的,而 glibc realloc() 需要它才能工作,这个问题允许通过在低端以非标准方式挖掘来回答级别 malloc 内部。

malloc_usable_size returns 传递的指针指向的已分配内存块中的可用字节数。这不一定是原始请求的大小;就是提供的大小,可能会大一些,看配置软件方便。

GNU C 库显然没有直接记录这一点:

所以我想您可能会认为最后一页已经获得了 GNU C 库的认可。它说 size_t malloc_usable_size(void *ptr) “returns ptr 指向的块中的可用字节数,指向由 malloc(3) 或相关函数分配的内存块的指针,”并表示该函数在 <malloc.h> 中声明。此外,如果 ptr 为空,则返回零。