我意识到,任何这样的功能很可能是非标准,但没关系我的使用情况。 基本上,我需要一种方法,我可以将指针传递给返回块中的指针的大小(这是由先前调用返回到malloc()函数的指针)(即使它通过的glibc的系统调用()接口仅暴露)指着。 这样的事情存在吗?
Answer 1:
所以,据我所知,至少有在C90 / C99无此功能。 一些系统上,大多数的libc,提供(在Mac OS X如malloc_size())获得分配的大小的功能,但这并不是便携,或许你应该避免使用的最好的。
Answer 2:
有没有必要使用非标准的功能,它不是很难与必要的功能写你自己的分配器。
你必须知道的大小,当你分配的块,所以干脆保留该信息。 有少数情况下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地址作为密钥,并且大小为内容,并使用相同的包装技术从块分开存储大小 - 牺牲或性能,额外的存储,并且在可管理块的数量方面的能力或许有些有限的限制。
但是你这样做,根本点依然有效 - 包装的基本服务提供你所需要的。
Answer 3:
_msize在Windows平台上。
文章来源: Any function to query the size of an allocated block?