没有技术问题阻止C标准委员会添加一个新的库函数来检索通过
malloc()
、
calloc()
、
realloc()
、
aligned_alloc()
、
strdup()
或任何类似函数返回的有效指针所能访问的字节数。返回的数字不一定是最初传递给分配函数的大小,并且有可能根本没有这些信息,因此返回值
0
表示该信息不可用。
至今未添加这样一个函数的原因可能是C标准委员会通常很不愿意添加新函数。例如,即使在大多数C库中一直提供稳定实现,也花费了30多年时间才将
strdup()
最终纳入C标准(它将成为下一个版本的一部分)。
对于任何先前未返回过内存分配函数或已经释放的指针,该函数将具有未定义行为,就像
free
或
realloc
一样。关于
NULL
是否定义,存在争议,但在这种情况下,返回值
0
似乎是合适的。如果大小未知,则对于不存储此信息的虚拟分配器,返回值
0
也表示此条件。
以下是GNU lib C中
malloc_usable_size
手册页的摘要:
NAME
malloc_usable_size
- obtain size of block of memory allocated from heap
SYNOPSIS
#include <malloc.h>
size_t malloc_usable_size(void *ptr);
DESCRIPTION
The malloc_usable_size()
function returns the number of usable bytes in the block pointed to by ptr
, a pointer to a block of memory allocated by malloc(3)
or a related function.
RETURN VALUE
malloc_usable_size()
returns the number of usable bytes in the block of allocated memory pointed to by ptr
. If ptr
is NULL
, 0
is returned.
ATTRIBUTES
Multithreading (see pthreads(7)
): the malloc_usable_size()
function is thread-safe.
CONFORMING TO
This function is a GNU extension.
NOTES
The value returned by malloc_usable_size()
may be greater than the requested size of the allocation because of alignment and minimum size constraints. Although the excess bytes can be overwritten by the application without ill effects, this is not good programming practice: the number of excess bytes in an allocation depends on the underlying implementation.
The main use of this function is for debugging and introspection.
SEE ALSO
malloc(3)
free
不存在,C语言没有保护性API(“protective”这个词用得对吗?) - David Ranierifree
相同的限制,即参数必须是由分配函数返回的指针,而不是后来释放的。但那又怎样呢?为了容纳像Stephen提到的那些指针的使用,大多数代码需要假设假想的大小函数不能使用,因此提供这样的函数几乎没有什么意义。释放是完全不同的用例。 - John Bollingervoid *
,这是编译器无法控制的,甚至无法发出警告,但是void *
是有用的。 - David Ranierifree
相同的限制,但它将很少被使用,正如问题中提出的特定于实现的示例一样。请记住,这不是可行性问题,而是对那些负责编写和维护标准的人的决策过程进行猜测的问题。 - John Bollinger