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

时间:2012-09-23 20:17:35

标签: c memory-management

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

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

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

5 个答案:

答案 0 :(得分:21)

历史原因。

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

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

修改

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

关于引入malloccalloc的第一句话可能完全错误。

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

答案 1 :(得分:4)

我能提出的唯一理由是

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

短一个字符
int *foo = malloc(42 * sizeof *foo);

真正的原因显然已经失去了 millennia 世纪数十年的C历史,并且需要编程语言考古学家来发掘,但可能与以下事实有关:< / p>

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

答案 2 :(得分:1)

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

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

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

以下是参考资料:

malloc calloc

答案 3 :(得分:0)

只是设计。

你可以编写自己的calloc

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

答案 4 :(得分:0)

您不应该使用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();