free()只需要指针值来释放已分配的内存.这意味着C知道分配的内存块有多大.那么为什么没有一些内置函数来查找指针数组的大小?
我知道惯例是跟踪数组大小,但鉴于已经有一些本地发生的内存管理,为什么我们不利用它来size()为数组提供方便的功能?
这样的功能是可能的.问题是为什么C标准不要求它.
GNU C库实现提供了malloc_usable_size()与您建议的类似的功能.它返回malloc()ed指针的可用字节数- 由于各种原因,它可能大于请求的大小.
这并不是100%清楚为什么标准中没有这样的功能.它没有在1989 ANSI C基本原理或ISO C99基本原理中提及.
有一点要记住的是一个实现并不需要跟踪被请求的字节数的malloc()调用.它通常会将请求汇总到更大的值,并且只需要跟踪它.
就此而言,free()不一定需要知道被解除分配的块的大小.它可能只是调用一些不提供该信息的低级函数.或者,例如,已分配的块可以组织成链接列表,每个分配的大小一个列表; free()可能只是从该列表中释放一个块而不必知道大小.
最后,C程序员几十年来一直没有这样的功能.添加提供它的要求会对所有实现施加一些(可能相当小的)开销.我认为态度是你可以简单地记住你要求的内存量,并根据需要使用这些信息.
如果您分配单个对象:
some_type *ptr = malloc(sizeof *ptr);
Run Code Online (Sandbox Code Playgroud)
然后sizeof *ptr给你对象的大小.如果你分配一个数组:
some_type *ptr = malloc(count * sizeof *ptr);
Run Code Online (Sandbox Code Playgroud)
然后sizeof *ptr只给你分配数组的单个元素的大小 - 但如果你记得你的值,count你可以很容易地计算所需的总大小.
底线:C标准可能需要这样的功能,但它并不是必需的.
更新: Kerrek SB在评论中提出了一个很好的观点,一个我没想过的评论.我将冒昧地在这里总结一下.
通过指向其初始元素的指针对数组进行操作的函数(并且有很多这样的函数)不应该关心如何分配数组.建议的size()函数(如GNU特定的malloc_usable_size())仅在参数指向堆分配的数组时才起作用.这意味着该函数要么必须假设数组是堆分配的(并且对于该假设是正确的!)或者给出额外的信息.在后一种情况下,也可以给出阵列的大小,这是size()多余的.