为什么calloc需要两个参数而malloc只需要一个?

Div*_*ero 14 c memory-management

我总是写作非常麻烦calloc(1, sizeof(MyStruct)).我不想使用包装此方法等的想法.我的意思是我想知道两个参数给了我什么?如果它给出了什么,为什么没有malloc两个参数?

顺便说一句,我搜索了这个问题的答案,但我没有找到一个非常好的答案.那些答案是calloc可以分配比罐子malloc等更大的块.

我看到另一个calloc分配数组的答案.随着malloc我可以繁殖,我会得到一个数组,我可以在没有1,开始时使用它.

oua*_*uah 21

历史原因.

calloc引入的时候,该malloc函数不存在,并且该calloc函数将为一个元素对象提供正确的对齐.

malloc被推出之后,我们决定返回将用于任何用途(花费更多的内存)正确对齐,因此只有一个参数是必需的存储器.API for calloc未更改,但calloc现在还返回正确对齐的内存以供任何使用.

编辑:

请参阅评论中的讨论和@JimBalter的有趣输入.

我的关于引进第一条语句malloc,并calloc可能是完全错误的.

真正的原因也可能与对齐无关.编译器实现者已经对C历史做了很多改变.malloc并且calloc可以来自不同的组/编译器实现者,这可以解释API差异.我实际上赞成这种解释是真正的原因.

  • 您能否引用 calloc 先于 malloc 的说法的参考文献?我从贝尔实验室 Unix 版本 6 开始就开始使用 C 进行编程,我几乎可以肯定这种说法是不正确的。 (2认同)
  • @JimBalter我也想删除我的答案,但我认为如果讨论仍然存在则更好. (2认同)

Chr*_*oph 5

我能想到的唯一原因是

int *foo = calloc(42, sizeof *foo);
Run Code Online (Sandbox Code Playgroud)

比 短一个字符

int *foo = malloc(42 * sizeof *foo);
Run Code Online (Sandbox Code Playgroud)

真正的原因显然是迷失了千年 世纪几十年的 C 历史,需要编程语言考古学家来挖掘,但可能与以下事实有关:

malloc()需要返回根据完整块大小对齐的内存块相反,当calloc()按预期使用时,内存块只需要根据作为第二个参数传递的大小进行对齐。然而,C 标准禁止在一致的实现中进行这种优化。