C 有查询已分配块大小的函数吗?

C 有查询已分配块大小的函数吗?,c,memory,malloc,glibc,C,Memory,Malloc,Glibc,我意识到任何这样的函数都可能是非标准的,但这对于我的用例来说是可以的。基本上,我需要一个方法(即使它只通过glibc的syscall()接口公开),我可以传递一个指针(之前调用malloc()返回的指针),返回指针指向的块的大小。这样的东西存在吗?据我所知,至少在C90/C99中没有这样的功能。一些系统(主要是libc)提供了获取分配大小的函数(例如Mac OS X中的malloc_size()),但这是不可移植的,您最好不要使用它。不需要使用非标准函数,编写自己的具有必要功能的分配器并不困难

我意识到任何这样的函数都可能是非标准的,但这对于我的用例来说是可以的。基本上,我需要一个方法(即使它只通过glibc的syscall()接口公开),我可以传递一个指针(之前调用malloc()返回的指针),返回指针指向的块的大小。这样的东西存在吗?

据我所知,至少在C90/C99中没有这样的功能。一些系统(主要是libc)提供了获取分配大小的函数(例如Mac OS X中的malloc_size()),但这是不可移植的,您最好不要使用它。

不需要使用非标准函数,编写自己的具有必要功能的分配器并不困难

分配块时必须知道大小,因此只需保留该信息即可。在IMO中,很少有情况下您不知道这些信息,因为根据定义,您在分配信息时就知道这些信息。但是,如果需要此类功能,只需包装malloc(),并将大小预挂起到块中即可

void* smalloc( size_t size )
{
    // allocate block with additional space for size
    void* blk = malloc( size + sizeof(size_t) ) ;

    // set the size
    *((size_t*)blk) = size ;

    // return pointer to block after size field (user block)
    return ((size_t*)blk) + 1 ;
}

void sfree( const void* blk )
{ 
    // Free from the size field address, not the user block
    free( ((const size_t*)blk) - 1 ) ;
}

size_t ssize( const void* blk )
{
    // Size is immediately before user block
    return *(((size_t*)blk) - 1) ;
}

关于吉姆·巴克的观点;在某些目标上,可能需要一些抖动来保持必要的对齐。如果对齐不是最佳的,一些目标将生成效率较低的代码,其他目标将导致中止。所以要小心这个解决方案。就我个人而言,我对这种解决方案的需要持谨慎态度

一种解决方案可能是使用一种数据结构,例如以malloc地址为键、大小为内容的哈希表,并使用相同的包装技术将大小与块分开存储——以牺牲性能或额外存储为代价,也许在可管理的数据块数量方面对容量有一些有限的限制


无论您如何操作,基本点仍然有效-包装基本服务以提供您所需。

在Windows平台上使用msize。

我们以前已经这样做过。我想了两次。链接来了。。。顺便说一句:我在搜索“[malloc]find size block”时发现了这些问题。我注意到这与Emil H在dmckee对原始问题的评论的第二个链接中给出的解决方案大致相同。然而,作为注释代码,它可能仍然有优点,所以我让它保持不变。这打破了malloc在特定平台上可能给您的任何对齐保证。例如,如果您所处的平台保证8字节对齐,则此代码示例现在将其转换为4字节对齐。同意。关于这一问题增加了补充说明。