查询分配块大小的任何函数?

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

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

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

分配块时必须知道大小,因此只需保留该信息即可。 当您不知道该信息时,很少有IMO情况,因为根据定义,您在分配信息时就知道了这一点。 但是,如果您需要这样的function,您可以通过包装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。