c - 为什么 C 中没有内置函数来查找指针数组的大小?

标签 c sizeof

<分区>

free() 只需要指针值来释放分配的内存。这意味着 C 知道分配的内存块有多大。那怎么没有一些内置函数来查找指针数组的大小呢?

我知道惯例是跟踪数组大小,但考虑到已经有一些内存管理在 native 发生,为什么我们不利用它来有一个方便的 size() 函数数组?

最佳答案

这样的功能是可以实现的。问题是为什么 C 标准不需要它。

GNU C 库实现提供了一个函数 malloc_usable_size()这与您的建议相似。它返回 malloc()ed 指针的可用字节数 -- 由于各种原因,它可能大于请求的大小。

目前还不是 100% 清楚为什么标准中没有这样的功能。 1989 ANSI C Rationale 中未提及或在 ISO C99 Rationale .

要记住的一件事是,实现不需要跟踪malloc() 调用请求的字节数。它通常会将请求四舍五入到某个更大的值,并且它只需要对其进行跟踪。

就此而言,free() 不一定需要知道被释放的 block 的大小。它可能只是调用一些不提供该信息的低级函数。或者,例如,分配的 block 可能被组织成链表,每个分配的大小一个列表; free() 可能只是从该列表中释放一个 block ,而不必知道大小。

最后,C 程序员几十年来一直没有这样的功能。添加一个要求来提供它会给所有实现带来一些(可能相当小的)开销。我认为态度是您可以简单地记住您要求的内存量,并根据需要使用该信息。

如果分配单个对象:

some_type *ptr = malloc(sizeof *ptr);

然后 sizeof *ptr 为您提供对象的大小。如果你分配一个数组:

some_type *ptr = malloc(count * sizeof *ptr);

然后 sizeof *ptr 只给你分配数组的单个元素的大小——但是如果你记得 count 的值,你可以计算请求的总数大小很容易。

底线:C 标准可能需要这样的函数,但实际上并不是必需的。

更新: Kerrek SB 在评论中提出了一个很好的观点,这是我没有想到的。我冒昧地在这里总结一下。

通过指向其初始元素的指针对数组进行操作的函数(并且有很多这样的函数)不必关心数组是如何分配的。提议的 size() 函数与 GNU 特定的 malloc_usable_size() 一样,仅在参数指向堆分配数组时才起作用。这意味着该函数要么必须假设该数组是堆分配的(并且该假设是正确的!),要么被提供额外的信息。在后一种情况下,还不如给定数组的大小,使 size() 变得多余。

关于c - 为什么 C 中没有内置函数来查找指针数组的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38516160/

相关文章:

c - 理解 size_t 类型和 sizeof 运算符的问题

c - 如何通过指向结构中的松弛字节来访问另一个变量的数据?

将二进制字符串转换为整数

c - 反转从文件加载的 1GB 字符串

c - 路径变量和环境变量

c - 为什么更改指向数组名称的指针会改变结果?

c - 为什么 sizeof(long long) 返回 8?

c - 在参数中使用指针时的类型转换

c - 如何让SetTimer()只发送一条WM_TIMER消息?

c - 为什么 sizeof(x++) 不增加 x?