我总是写calloc(1, sizeof(MyStruct))
非常麻烦。我不想使用包装此方法等的想法。我的意思是我想知道两个参数给了我什么?如果它给出了某些东西,为什么malloc
也没有两个参数?
顺便说一句,我搜索了这个问题的答案,但我没有找到一个非常好的答案。这些答案是calloc
可以分配比malloc
更大的块等等。
我看到calloc
分配数组的另一个答案。使用malloc
我可以繁殖,我会得到一个数组,我可以在开始时不使用1,
使用它。
答案 0 :(得分:21)
历史原因。
在引入calloc
时,malloc
函数不存在,calloc
函数将为一个元素对象提供正确的对齐。
之后引入malloc
时,确定返回的内存将正确对齐以供任何使用(这需要更多内存),因此只需要一个参数。 calloc
的API未更改,但calloc
现在还返回正确对齐的内存以供任何使用。
修改强>
请参阅评论中的讨论以及来自@JimBalter的有趣输入。
关于引入malloc
和calloc
的第一句话可能完全错误。
另外,真正的原因也可能与对齐无关。编译器实现者已经对C历史做了很多改变。 malloc
和calloc
可能来自不同的组/编译器实现者,这可以解释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
不会将此块初始化为任何内容。
这两个功能基本上为您提供相同的功能。
以下是参考资料:
答案 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();