如果指向一个用malloc分配的内存块的指针,它的大小是什么?
例如:
void* ptr = malloc( 10 ); //Allocate 10 bytes
printf( "%d", GetMemSize( ptr ) ); //Should print 10
我想这样做是为了调试目的。
答案 0 :(得分:7)
在Visual C ++中,您可以使用_msize()
。
答案 1 :(得分:3)
Microsoft CRT有一个函数size_t _msize(void *memblock);
,它将为您提供已分配块的大小。请注意,由于堆管理器管理内存的方式,这可能(实际上可能是)大于所要求的大小。
这是特定于实现的,如其他答案中所述。
答案 2 :(得分:0)
如果你知道它的实现方式,你只能获得大小,因为它是特定于实现的。我必须跟踪内存并且必须像this question那样编写自己的包装器。正如David Heffernan所说,你必须记住我在包装中必须做的大小
答案 3 :(得分:0)
由于malloc
的实现是特定于系统和体系结构,因此没有通用(标准化)方法。唯一保证的行为是malloc(N)
将返回至少N个字节或NULL。 malloc
总是分配比询问更多的内存 - 存储要求的大小(N),通常还有一些额外的簿记数据。
特定于Windows / Visual C ++:
在malloc
返回地址之前,其他数据存储在内存段中。
如果p = malloc(N)
和p != 0
如果只知道p
,您可以使用以下代码来确定要求的内存大小:
Windows NT:unsigned long ulAllocSize = *((unsigned long*)p - 4);
Windows CE:unsigned long ulAllocSize = *((unsigned long*)p - 2);
请注意ulAllocSize
不是用malloc
分配的整个块的大小,而只是作为参数传递的值 - N
。