21

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

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

我看到了另一个calloc分配数组的答案。有了malloc我可以乘法,我会得到一个数组,我可以在一开始就使用它1,

4

5 回答 5

28

历史原因。

calloc引入时,该malloc功能不存在,该calloc功能将为一个元素对象提供正确的对齐方式。

之后引入时malloc,决定返回的内存将正确对齐以供任何使用(这会花费更多内存),因此只需要一个参数。的 APIcalloc未更改,但calloc现在还返回正确对齐的内存以供任何使用。

编辑:

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

我关于引入mallocand的第一个陈述calloc可能是完全错误的。

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

于 2012-09-23T20:30:09.103 回答
4

我能想到的唯一原因是

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

比短一个字符

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

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

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

于 2012-09-23T21:58:38.243 回答
0

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

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

这两个功能本质上为您提供了相同的功能。

以下是参考资料:

malloc calloc

于 2012-09-23T20:23:30.197 回答
-1

这只是设计使然。

你可以写你自己的calloc

void *mycalloc(size_t num, size_t size)
{
    void *block = malloc(num * size);
    if(block != NULL)
        memset(block, 0, num * size);
    return block;
}
于 2012-09-23T20:29:46.457 回答
-2

您不应该使用 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();
于 2012-09-23T20:56:02.627 回答