2010-10-07 63 views
7

我试图写一个函数的大小是这样的:如何查找调用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如何打包标题位?

谢谢,我很欣赏这一点。我确定这段代码有些问题,它不是特别便携,可能依赖于系统,但是我为了好玩而做。

+3

如果你能得到这个工作,它只会在你的'malloc'特定实现上起作用。另一个系统可能会使用一个不同的'malloc',并试图在向后移动数组后端去引用指针可能会导致内存访问冲突并导致应用程序崩溃。更可靠的方法是在调用'malloc'时记录内存区域的大小,并引用该值而不是试图剖析'malloc'的元数据。 – bta 2010-10-07 23:20:36

+0

不要这样做。如果您需要知道尺寸,请自行存储,但在大多数情况下可能无用。请记住,C的高级未来派实现将*不会*将大小存储在任何可从程序中访问的位置,不会在指针和整数类型之间进行转换,并且如果增加或减少指针,则会真正陷入并中止程序超过对象的边界或尝试对指向不同对象的指针进行算术运算。该标准允许实施的灵活性有很好的理由。 – 2010-10-08 00:26:59

+1

假设你的'malloc'仅限于分配两个大小的块。假设你有一个动态大小的12字节对象数组,并且请求初始容量为100.如果你用C标准来做事情,当你的数组增长到100个元素时,你必须“重新分配”。如果你能得到块的实际大小,你可以让你的数组在重新分配之前增长到170个元素。所以能够获得块的大小有效率优势。 – dan04 2010-10-08 02:50:55

回答

6

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

4

我认为你依赖于某些实现特定的malloc()行为。 malloc()的实现是系统特定的,并且specification几乎没有提及如何执行此操作。

2

有没有便携的方式来做到这一点。正如其他人所说的,要么是看看你的分配器的代码,如果你正在做一次性的程序,或者对于一些图书馆(MS)有_msize的扩展。 malloc被允许在分配器中执行它想要的内容来跟踪内容,并且没有“安全”或符合标准的获取数据的方式。

如果您确实需要在真实应用程序中使用此功能,则必须在malloc/free之间构建一个填充分配大小表的垫片。

0

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