一直写,很麻烦calloc(1, sizeof(MyStruct))
。我不想使用包装此方法等的想法。我的意思是我想知道两个参数给了我什么?如果它给出了一些东西,为什么也没有malloc
两个参数?
顺便说一句,我搜索了这个问题的答案,但我没有找到一个很好的答案。这些答案是calloc
可以分配比malloc
can 等更大的块。
我看到了另一个calloc
分配数组的答案。有了malloc
我可以乘法,我会得到一个数组,我可以在一开始就使用它1,
。
一直写,很麻烦calloc(1, sizeof(MyStruct))
。我不想使用包装此方法等的想法。我的意思是我想知道两个参数给了我什么?如果它给出了一些东西,为什么也没有malloc
两个参数?
顺便说一句,我搜索了这个问题的答案,但我没有找到一个很好的答案。这些答案是calloc
可以分配比malloc
can 等更大的块。
我看到了另一个calloc
分配数组的答案。有了malloc
我可以乘法,我会得到一个数组,我可以在一开始就使用它1,
。
历史原因。
在calloc
引入时,该malloc
功能不存在,该calloc
功能将为一个元素对象提供正确的对齐方式。
之后引入时malloc
,决定返回的内存将正确对齐以供任何使用(这会花费更多内存),因此只需要一个参数。的 APIcalloc
未更改,但calloc
现在还返回正确对齐的内存以供任何使用。
编辑:
请参阅评论中的讨论和来自@JimBalter的有趣输入。
我关于引入malloc
and的第一个陈述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();