2011-09-24 122 views
8

IMO一个就够了,为什么calloc要求将它分成两个参数?为什么calloc需要两个参数,而malloc只有一个参数?

+10

的丰富的历史只是每天提醒由于一些程序员创建它的方式,并因此永远留... – 2011-09-24 01:45:20

+1

如果你不'不喜欢它,'#define calloc(x)(calloc)(x,1)'应该工作。 –

+5

@Chris使用预处理器重新定义malloc或family似乎是一个非常糟糕的想法(除了可能用于调试内存分配)。 – ssube

回答

3

参数名称记录它相当好:

void *malloc(size_t size); 
void *calloc(size_t nelem, size_t elsize); 

后一种形式允许阵列整齐分配,通过提供的元件和元件尺寸的数量。乘以malloc可以实现相同的行为。

但是,calloc也将分配的内存初始化为0. malloc没有初始化,所以该值未定义。在理论上,由于没有设置所有的存储器,因此可以更快地获得malloc;这只是可能会被大量注意到。

this question中,建议calloc为clear-alloc,malloc为mem-alloc。

+4

两个参数的另一个好处是可能会进行溢出检查,通常很难(并且很少完成)'malloc'(尽管如果分配的是大小可能会溢出你可能会做错了)。 –

+1

@Chris:也许我们需要一个'cccalloc',它需要6个参数,并且在所有子表达式上用溢出检查分配'a * b + c * d + e * f'字节... ;-) –

+6

我不认为这是对这个问题的回答。这不会问这些工作如何(那么它将只是一个重复的,应该被关闭)。它要求将参数分成两部分的理由,而不是'malloc'的总大小。 –

5

我想这可能是历史,并早于C为函数创建原型的时代。在没有原型的这些时候,论据基本上必须是inttypedefsize_t可能还没有发明。但INTMAX是您可以分配的最大块,并且可以分配两块,这只会给您更多的灵活性,并允许您分配真正大的数组。即使在那个时候,也有一些方法可以从系统中获取大型页面,默认情况下已将其归零,因此callocmalloc之间的效率差别不大。

如今,随着size_t和手头的函数原型,这是C.

+0

这根本不回答问题。所使用的整数类型的宽度与此问题完全无关。 – Jeff

+0

@杰夫,你能解释一下吗?我并不是说今天使用的整数类型的宽度与它有什么关系。我说的是,在创建界面的时候,这可能是一个问题。 –

+0

我反对这个建议,即“真正的大阵列”。使用两个参数代替一个参数是糟糕的API设计。为什么有人希望'calloc'是一个指针,它们随后不能“realloc”,或者它们不能使用,例如'memset'或'memcpy'?随意在我的琐事中感到恼火,但可以合理地说一下sizeof()返回无符号和分配数组的大小,这比'INT_MAX'略大。 – Jeff

相关问题