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

时间:2010-10-07 23:04:09

标签: c memory-management 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如何打包标题位?

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

7 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:6)

如果你想偷看内存并超出你的malloc()返回的内存,我建议你获取你的分配器的源代码。这比实验更快更安全。 ; - )

答案 2 :(得分:4)

我认为您依赖于某些特定于实现的malloc()行为。 malloc()的实施是针对特定系统的,specification对如何执行此操作的提法很少。

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

这不符合标准。但是有一些特定于平台的功能可以执行此操作,例如_msizemalloc_usable_size