【发布时间】:2018-02-15 19:52:26
【问题描述】:
calloc() 处理 count 和 size 参数的方式有区别吗?例如:
// calloc() parms are "count", then "size"
ptr1 = calloc( 1, 20 );
ptr2 = calloc( 20, 1 );
显而易见的假设是,它在内部将两者相乘以获得总字节数,并且实际上并不关心哪个是计数,哪个是大小。但这是真的吗?
导致它的两个参数之间是否存在细微差别,因此我们应该小心传入哪个作为计数与大小?
(是的,我知道 calloc 可以通过使用 2 个参数来检测溢出,而 malloc() 不能,但这并不能回答我的问题。)
【问题讨论】:
-
如果你颠倒了数字,你就会颠倒意思,如果你这样做,你就会看起来你不知道自己在做什么。
-
将参数一分为二为分配器提供了更多可能在其分配方案中使用的信息。它可能不会使用它,但万一它使用,你就会对它撒谎。如果你对它撒谎,如果它表现不佳,是谁的错?
-
您的问题的答案是是,正如下面的答案(以及重复问题的答案)所指出的那样。但是,如果您想了解为什么会这样,请记住
calloc将尝试分配适当对齐的连续内存。连续性是允许参数交换的东西,适当的对齐确保您可以正确访问第一个(以及随后的)元素。 -
@user934063 你是想告诉我,如果我 calloc(3, 4) 与 calloc(4, 3) 并将其用作 12 个单字节的数组,则有些字节可能无效,由于对齐问题而无法获得或非零?我很难相信!
-
@Stéphane 如果这就是我所说的,我也很难相信这一点。不,这不是我想说的。我想说的是,如果不能保证连续性,那么
calloc(2, 4)原则上(阅读:思想实验)可以将这两个 4 字节元素存储在不同的位置,而不是“彼此相邻”。这与calloc(4, 2)不同。因此要点:contiguity 是使交换性(即交换参数)成为可能的原因。要回答您关于对齐的问题,请参阅下一条评论...