首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么没有内置函数来查找C中指针数组的大小?

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

Stack Overflow用户
提问于 2016-07-21 23:58:43
回答 4查看 123关注 0票数 0

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-07-22 00:24:44

这样的职能是可能的。问题是为什么C标准不需要它。

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

目前还不完全清楚为什么标准中没有这样的功能。这一点在1989年的ANSI C原理ISO C99原理中都没有提到。

需要记住的一点是,实现不需要跟踪malloc()调用请求的字节数。它通常会将请求聚合到更大的值,并且只需要跟踪它。

因此,free()不一定需要知道被解除分配的块的大小。它可能只是调用一些不提供这些信息的低级函数。或者,例如,分配的块可能被组织成链接列表,每个分配大小都有一个列表;free()可以简单地从该列表中释放一个块,而不必知道大小。

最后,C程序员在没有这种功能的情况下已经相处了几十年。添加一个提供它的需求将给所有实现增加一些(可能相当小)的开销。我认为您的态度是,您可以简单地记住您需要多少内存,并根据需要使用这些信息。

如果分配一个对象:

代码语言:javascript
复制
some_type *ptr = malloc(sizeof *ptr);

然后sizeof *ptr给出对象的大小。如果您分配了一个数组:

代码语言:javascript
复制
some_type *ptr = malloc(count * sizeof *ptr);

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

底线:C标准可能需要这样的功能,但它并不是真正必要的。

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

通过指向数组初始元素的指针对数组进行操作的函数(而且有很多这样的函数)不应该关心数组是如何分配的。建议的size()函数像特定于GNU的malloc_usable_size()一样,只有当参数指向堆分配的数组时才能工作。这意味着函数要么必须假定数组是堆分配的(并且正确地考虑了这个假设!)或者得到额外的信息。在后一种情况下,最好给出数组的大小,从而使size()成为多余的。

票数 6
EN

Stack Overflow用户

发布于 2016-07-22 00:28:06

free()可能使用内部数据来回收正在释放的内存块,但请注意,这些数据不一定包含传递给malloc()calloc()realloc()分配该块的确切大小。C标准没有指定检索此信息的函数。

大多数malloc()实现提供了一个非标准函数来检索所分配块的可用大小:在Glibc中,该函数是size_t malloc_usable_size(void *ptr);。其他库可能具有不同的函数,或者根本没有检索此信息的函数。

至于检索具有指针的数组大小的一般解决方案,这通常是不可能的。在高效的实现中,指针不携带大小信息。实现包含这些信息的胖指针是可能的,但是整个系统需要这样编译。一些集成编译器(如tcc )支持这种方法来提供运行时指针检查。

票数 2
EN

Stack Overflow用户

发布于 2016-07-22 00:05:29

因为基本上,地址将指向内存块,其中包含元数据(例如块的大小)。释放该条目实际上将标记可用的块(如果指针有效)。

如果调用者随后访问该内存位置,则这是未定义的行为。因此,即使从这个角度来看,自由也会完成它的任务。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38516160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档