calloc的两个参数

时间:2010-11-03 03:02:38

标签: c calloc

为什么calloc采用两个参数而不是malloc

具体来说,由于以下表达式之间没有区别(或者存在?):

calloc (a, b);
calloc (b, a);
calloc (a * b, 1);
calloc (1, a * b);

为什么不接受要分配的总字节数?这个界面背后的理由是什么?为什么这不适用于malloc?

5 个答案:

答案 0 :(得分:7)

我听到两个[互斥的]解释为什么它有两个论点:

  1. calloc负责检查乘法上的溢出。如果请求的块的总大小太大(如溢出size_t),则calloc返回空指针以指示失败。使用malloc,您必须自己注意溢出,许多人根本忘记这样做。 (虽然标准库的历史知道忽略溢出的calloc实现的示例,因此工作不正确。)

  2. calloc实际上允许分配比size_t类型范围更大的内存块,即calloc可能能够执行适当的非溢出大乘法它的参数并分配结果大小的块。出于这个原因,由于calloc使用两个size_t类型的参数,它可以分配比malloc更大的块(因为malloc只接受一个类型的参数size_t)。

  3. 我一直认为第一个解释是正确的。然而,在阅读了这里的一些帖子后,我有疑虑。

答案 1 :(得分:3)

我相信malloc可以保证返回一个内存区域,该区域根据与第二个参数指示的大小兼容的最粗糙的要求进行对齐。例如,如果系统需要对齐2和4字节整数,并且第二个参数为10,则返回的指针必须在双字节边界上对齐;如果第二个参数是12,则指针将在四字节边界上对齐。我怀疑在实践中,许多系统会将所有返回的指针对齐到最大可能需要的边界,无论大小如何,但我不认为除了calloc之外它是必需的。

答案 2 :(得分:0)

calloc(x,y)相当于malloc(x*y)

但是calloc正在执行其他操作(将值设置为0)memset(block, 0, x*y)

此函数仅用于通过大小的元素元素数量,在malloc中,您必须将此值相乘以获得所需的字节数,这函数在乘法中检查整数溢出。

例如,如果要为12个整数分配内存并且想要对此整数执行某些操作,并且必须将其值设置为0,请使用calloc(12, sizeof(int))

但是如果你想分配一些内存块(256字节)以便将来复制到某个字符串,那么memset对你来说是不可用的,那么最好使用malloc(sizeof(char) * 256)或者例如{{ 1}}


malloc(sizeof(wchar_t) * 256)

答案 3 :(得分:0)

唯一值得注意的区别是calloc需要将分配的空间初始化为零,而malloc没有此类保证。否则,我想只是出于历史原因,有两种不同的功能。

答案 4 :(得分:0)

一切都只是字节是一个相对较新的(即c / Unix时代)发明 - 在很多其他架构上的东西都是固定大小的记录。