为什么calloc接受两个参数而malloc只有一个?

x86*_*x86 8 c calloc

IMO就足够了,为什么calloc要将它分成两个参数呢?

Jen*_*edt 7

我猜这可能是历史,早于C有功能原型的时代.在没有原型的这些时候,基本上必须有这些论点int,typedef size_t甚至可能还没有发明.但是,INTMAX你可以分配的最大块,malloc并将它分成两部分,只是为了给你更多的灵活性,并允许你分配真正大的数组.即使在那个时候有方法来获得,其中默认清零从系统大页,所以效率不是这么多的问题callocmalloc.

如今,随着size_t手头的功能原型,这只是C的丰富历史的每日提醒.


ssu*_*ube 2

参数名称很好地记录了它:

void *malloc(size_t size);
void *calloc(size_t nelem, size_t elsize);
Run Code Online (Sandbox Code Playgroud)

后一种形式允许通过提供元素数量和元素大小来整齐地分配数组。通过乘法可以实现相同的行为malloc

但是,calloc还将分配的内存初始化为 0。malloc没有 init,因此该值未定义。malloc理论上可以更快,因为没有设置所有内存;只有大量的情况下才可能注意到这一点。

这个问题中,建议是callocclear-alloc,malloc是mem-alloc。

  • 我不认为这是问题的答案。这并不询问这些是如何工作的(那么它只是一个重复的并且应该被关闭)。它要求将参数一分为二,而不是像“malloc”那样只有一个总大小。 (7认同)
  • 两个参数的另一个好处是潜在的溢出检查,通常使用“malloc”很困难(并且很少完成)(尽管如果您分配的对象的大小可能会溢出,那么您可能会做错)。 (4认同)
  • @Chris:也许我们需要一个带有 6 个参数的 `cccalloc` 并分配 `a*b + c*d + e*f` 字节,并对所有子表达式进行溢出检查...;-) (2认同)