一直写,很麻烦calloc(1, sizeof(MyStruct))。我不想使用包装此方法等的想法。我的意思是我想知道两个参数给了我什么?如果它给出了一些东西,为什么也没有malloc两个参数?
顺便说一句,我搜索了这个问题的答案,但我没有找到一个很好的答案。这些答案是calloc可以分配比malloccan 等更大的块。
我看到了另一个calloc分配数组的答案。有了malloc我可以乘法,我会得到一个数组,我可以在一开始就使用它1,。
一直写,很麻烦calloc(1, sizeof(MyStruct))。我不想使用包装此方法等的想法。我的意思是我想知道两个参数给了我什么?如果它给出了一些东西,为什么也没有malloc两个参数?
顺便说一句,我搜索了这个问题的答案,但我没有找到一个很好的答案。这些答案是calloc可以分配比malloccan 等更大的块。
我看到了另一个calloc分配数组的答案。有了malloc我可以乘法,我会得到一个数组,我可以在一开始就使用它1,。
历史原因。
在calloc引入时,该malloc功能不存在,该calloc功能将为一个元素对象提供正确的对齐方式。
之后引入时malloc,决定返回的内存将正确对齐以供任何使用(这会花费更多内存),因此只需要一个参数。的 APIcalloc未更改,但calloc现在还返回正确对齐的内存以供任何使用。
编辑:
请参阅评论中的讨论和来自@JimBalter的有趣输入。
我关于引入mallocand的第一个陈述calloc可能是完全错误的。
此外,真正的原因也可能与对齐无关。C 的历史已经被编译器实现者改变了很多。malloc并且calloc可能来自不同的组/编译器实现者,这将解释 API 的差异。我实际上赞成这种解释作为真正的原因。
我能想到的唯一原因是
int *foo = calloc(42, sizeof *foo);
比短一个字符
int *foo = malloc(42 * sizeof *foo);
真正的原因显然已经迷失了千年 世纪几十年的 C 历史,需要编程语言考古学家来发掘,但可能与以下事实有关:
与malloc()- 它需要返回根据完整块大小对齐的内存块 -calloc()按预期使用时,内存块只需要根据作为第二个参数传递的大小进行对齐。但是,C 标准禁止在符合要求的实现中进行这种优化。
这只是设计使然。
你可以写你自己的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();