我正在尝试编写像这样的大小函数:
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如何打包标题位?
谢谢,我很感激。我确定这段代码有问题,而且它不是特别便携,可能与系统有关,但我这样做很有趣。
答案 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)
这不符合标准。但是有一些特定于平台的功能可以执行此操作,例如_msize
或malloc_usable_size
。