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

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

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

我看到calloc分配一个数组的另一个答案。 使用malloc我可以繁殖,我会得到一个数组,我可以在开始时使用它而不用1,

历史原因。

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

之后引入malloc时,确定返回的内存将适合任何使用(这需要更多内存),因此只需要一个参数。 calloc的API没有改变,但calloc现在也返回正确对齐的内存以供任何使用。

编辑:

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

我关于引入malloccalloc第一个陈述可能完全错误。

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

我能想出的唯一原因是

 int *foo = calloc(42, sizeof *foo); 

比一个字符短

 int *foo = malloc(42 * sizeof *foo); 

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

malloc()相反 – 当需要返回按照整个块大小对齐的内存块时 – 当按预期使用calloc() ,内存块只需要根据作为第二个参数传递的大小进行对齐。 但是,C标准禁止在符合实现中进行此优化。

calloc在内存中分配一个元素数组,其元素数量(第一个参数)乘以要分配指定数量(第二个参数)的元素大小。 另外, calloc将此数组初始化为0.元素的大小可能大于一个字节,函数会为您计算所需的内存大小。

malloc接受一个分配指定字节数的参数,并为您提供指向该字节的指针。 此外, malloc不会将此块初始化为任何内容。

这两个function基本上为您提供相同的function。

这是参考资料:

malloc calloc

它只是设计。

你可以编写自己的calloc

 void *mycalloc(size_t num, size_t size) { void *block = malloc(num * size); if(block != NULL) memset(block, 0, num * size); return block; } 

您不应该使用calloc(或malloc或类似的东西)分配对象。 尽管calloc对其进行了零初始化,但就C ++而言,该对象仍未构建。 使用构造函数:

 class MyClass { private: short m_a; int m_b; long m_c; float m_d; public: MyClass() : m_a(0), m_b(0), m_c(0), m_d(0.0) {} }; 

然后使用new (或在堆栈上,如果可以)实例化它:

 MyClass* mc = new MyClass();