如何获取由函数“malloc”锁定的内存段指针的大小 [重复]

Posted

技术标签:

【中文标题】如何获取由函数“malloc”锁定的内存段指针的大小 [重复]【英文标题】:How can I get the size of a pointer of a segment of memory, mallocked by function "malloc" [duplicate] 【发布时间】:2011-05-17 02:55:00 【问题描述】:

可能的重复:How can I get the size of an array from a pointer in C?Any tool to find size of memory allocated dynamically using malloc/realloc?

如果只给定一个指针,我怎样才能得到一个内存段指针的大小,ma​​lloc被函数ma​​lloc锁定 /p>

???

【问题讨论】:

没有便携的方法。 为什么需要它?如果您说出原因,那么 SO 的人可能会为您提出解决方案。 许多重复...搜索...***.com/questions/2373749/…...***.com/questions/3886539/…...***.com/questions/2478240/… -1 发布前不搜索。 @Nyan:我也怀疑 Macroideal 没有搜索,但你不能确定。你会注意到我找到的重复的标题有多么不同。 【参考方案1】:

这是一个例子:

typedef struct _BlockHeader 
    int Size;
 BlockHeader;

void *MyMalloc(int size) 
    char *ptr = malloc(size + sizeof(BlockHeader));
    BlockHeader *hdr = (BlockHeader*)ptr;
    hdr->Size = size;
    return (ptr + sizeof(BlockHeader));


void MyFree(void *ptr) 
    char *myptr = (char*)ptr;
    free(myptr - sizeof(BlockHeader));


int GetPtrMallocedSize(void *ptr) 
    char *myptr = (char*)ptr;
    BlockHeader *hdr = myptr - sizeof(BlockHeader);
    return (hdr->size);

实际上,每个内存块都以标头开头,收集内存块信息。当然 realloc 和 calloc 也应该实现,但是内存块不能被其他期望“正常” malloced 内存的软件使用。

另一种方法是对指针进行哈希处理,并通过挂钩 malloc/free 函数来收集内存信息。

我知道 MS CRT 使用它来跟踪堆溢出和内存泄漏。不知道有没有什么副作用……其实我没用过。

【讨论】:

【参考方案2】:

您不能,至少在不知道malloc 的实现版本的内部结构以及分配块的数据结构的情况下是这样的。

【讨论】:

【参考方案3】:

你不能。由于您首先分配了内存,因此您有责任跟踪分配的内容和数量。

【讨论】:

【参考方案4】:

你用sizeof(p).得到指针p的大小

如果您询问用于完成 malloc 调用的内存块的大小,这可能是特定于版本的。

【讨论】:

【参考方案5】:

这没有标准,所以它的实现是特定的。但是,在 Windows 上,您可以使用 _msize

【讨论】:

以上是关于如何获取由函数“malloc”锁定的内存段指针的大小 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

void型指针

使用malloc函数出现段错误-一级指针-二级指针

使用malloc函数出现段错误-一级指针-二级指针

malloc用法整理

在C语言中,如何给函数分配内存?

C语言中malloc函数的使用方法是啥?