如何通过调用malloc()来分配多少空间?

我正在尝试编写像这样的大小函数:

size(void *p,int size); 

这将返回p指向的数组的大小。 例如:

 Int *a = malloc((sizeof(int)*100)); size(a,sizeof(int)); // this should return 100 

我认为这是可能的,因为如果我记得,malloc会跟踪在某些头字节中分配的空间。

这是我到目前为止所拥有的:

 int size(void *p, int size) { p = (unsigned int *)p - 1; unsigned int elements = (*(unsigned int *)p); return elements/size; } 

现在,假设分配的空间大小在指针之前的4个字节中,这应该返回字节或偏移量。 这是我有点黑暗的地方。 我无法弄清楚malloc如何格式化这些头字节的细节。 malloc如何打包标头位?

谢谢,我很感激。 我确定这段代码有问题,而且它不是特别便携,可能与系统有关,但我这样做很有趣。

如果你喜欢偷看并在你的malloc()返回的内存之外探索,我建议你获取你的分配器的源代码。 这比实验更快更安全。 😉

在Visual Studio中,您可以使用_msize()

我认为你依赖于一些特定于实现的malloc()行为。 malloc()的实现是特定于系统的,并且规范很少提及如何执行此操作。

没有可移植的方法来做到这一点。 正如其他人所说的那样,如果你正在进行一次性的一次性程序,要么查看你的分配器代码,要么某些库(MS)有像_msize这样的扩展。 允许malloc在分配器中执行它想要的东西来跟踪内容,并且没有“安全”或符合标准的方式来获取数据。

如果您真的需要在实际应用程序中可靠地使用此function,则必须在malloc/free周围构建一个垫片,以保留分配大小的表。

您可能会发现与glibc malloc相关的函数是有用的。 特别是,您可以调用mallinfo()来获取堆信息。 有些系统还定义了malloc_size ,它是malloc_size的BSD等价_msize

如果你真的想要走那条路,那么dlmalloc(glibc和uClibc上使用的malloc)在http://g.oswego.edu/dl/html/malloc.html上有一些文档。 此外,谷歌搜索如何利用堆溢出可能会为您提供每个平台的详细信息,包括没有源代码可用的平台。

它不符合标准。 但是有一些特定于平台的函数可以做到这一点,比如_msizemalloc_usable_size