malloc和calloc是如何以不同的签名结束的?

可能重复:
为什么calloc接受两个参数而malloc只有一个?

很多资源描述了malloccalloc之间的function差异,但是我不能轻易找到描述不同function签名背后的历史的资源:

  void *calloc(size_t nmemb, size_t size); void *malloc(size_t size); 

当然,前者的大小是每个成员的大小。 也许这个想法是可以通过操作系统懒惰地完成多页面大小的成员大小的calloc?

(我可以弥补原因以及下一个人 – 没有引用来源没有接受的答案。:-)

这对于解释C规范中使用的语言有些开放。

这里的语言似乎非常谨慎地选择 – malloc在7.20.3.3节中定义为:

malloc函数为一个对象分配空间,该对象的大小由size指定,其值是不确定的。

早些时候,第3.14节将对象定义为:

执行环境中的数据存储区域,其内容可以表示值

另一方面,calloc在7.20.3.1中定义为:

calloc函数为nmemb对象数组分配空间,每个对象的大小都是size。 空间初始化为所有位零。

这应该是显而易见的。 calloc和malloc之间的区别在于calloc为n个概念对象的数组分配内存,尽管实际上这与对malloc的调用没有区别,malloc为1个大小为(n * size)的概念对象分配空间。

所以下一个问题是……对于一个对象数组的空间和一个大对象的空间之间的区别是什么?

从程序员的角度来看,两个函数调用只是要求不同的东西。 一个是要求分配一大块内存 – 我会处理它。 另一个是说 – 我想要一个具有这种大小的n个数组的数组,给我一些我可以用于这个数组的内存,并将其归零 – 因为在大多数实现中我可以对归零内存的含义做出很好的假设。

您通过阅读规范,尝试将其用作malloc +归零的事实是对函数目的的误解。

他们最终得到了不同的签名,因为他们做了不同的事情。


一些可爱的想法…一个简单的malloc实现可以看起来像:

 #define malloc(x) (calloc(1, x)) 

值得注意的是,如果我的NULL指针表示没有归零,那么calloc将不会返回一个NULL指针数组。 更好的是,如果我设计一个整数表示,其中归零的内存不是((int)0),calloc将不会返回0的数组。