我想知道calloc()
是否比malloc
和memset
更可取。后者似乎是分配和初始化内存的最常见方式。
github代码搜索会发现许多calloc
测试和实现,但在最初的几页中,没有实际使用calloc
的代码。
是否有人知道任何使用或建议使用calloc
的项目/组织,以及在哪些情况下建议使用?
从下面的评论和答案中,以下是迄今为止出现的一些想法:
-
calloc(n, size)
可以防止malloc(n * size)
可能出现的溢出 -
将malloc和memset组合,使calloc有机会请求已知已为零的页面。
-
calloc的一个缺点是,组合的步骤可能会排除malloc周围的其他包装器。
好吧,我在很多C代码中使用了calloc
,所以我想这是一个答案。我认为稍微不寻常的调用方法(元素数量和元素大小(可能会让人大吃一惊。然而,您可能没有看到预期的那么多调用的另一个原因是,许多较大的项目使用malloc
、calloc
周围的包装器,以及在内存分配失败时进行错误处理(通常终止程序(的朋友。因此实际的代码使用xcalloc
。
使用calloc
而不是malloc
加上memset
的一个原因是calloc
可能更有效。如果C库已经知道页面为零(也许它只是从操作系统获得了新的零内存(,那么它不必显式地将其归零。