我试图写一个函数的大小是这样的:如何查找调用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'特定实现上起作用。另一个系统可能会使用一个不同的'malloc',并试图在向后移动数组后端去引用指针可能会导致内存访问冲突并导致应用程序崩溃。更可靠的方法是在调用'malloc'时记录内存区域的大小,并引用该值而不是试图剖析'malloc'的元数据。 – bta 2010-10-07 23:20:36
不要这样做。如果您需要知道尺寸,请自行存储,但在大多数情况下可能无用。请记住,C的高级未来派实现将*不会*将大小存储在任何可从程序中访问的位置,不会在指针和整数类型之间进行转换,并且如果增加或减少指针,则会真正陷入并中止程序超过对象的边界或尝试对指向不同对象的指针进行算术运算。该标准允许实施的灵活性有很好的理由。 – 2010-10-08 00:26:59
假设你的'malloc'仅限于分配两个大小的块。假设你有一个动态大小的12字节对象数组,并且请求初始容量为100.如果你用C标准来做事情,当你的数组增长到100个元素时,你必须“重新分配”。如果你能得到块的实际大小,你可以让你的数组在重新分配之前增长到170个元素。所以能够获得块的大小有效率优势。 – dan04 2010-10-08 02:50:55