calloc()的参数顺序是否重要?

时间:2018-02-15 19:52:27

标签: c calloc

calloc()处理计数和大小参数的方式有何不同?例如:

// calloc() parms are "count", then "size"
ptr1 = calloc( 1, 20 );
ptr2 = calloc( 20, 1 );

显而易见的假设是,在内部它将两者相乘得到总字节数,并且实际上并不关心哪个是计数,哪个是大小。但这是真的吗?

两个参数之间是否存在细微差别,因此我们应该注意我们传入哪一个作为计数与大小?

(是的,我知道calloc可以通过使用2个参数来检测溢出,而malloc()则不能,但是这并没有回答我的问题。)

1 个答案:

答案 0 :(得分:1)

来自标准7.22.3.2

 void *calloc(size_t nmemb, size_t size);
  

描述

     

2)calloc函数为nmemb个对象数组分配空间,每个对象的大小为size。空间初始化为所有位零。

你可以看到它是如何使用它的。所以不,没关系,但不要这样做。对于将维护代码的未来程序员来说,语义意义有时会更好。

同样来自7.22.3p1

  

未指定通过对aligned_alloc,calloc,malloc和realloc函数的连续调用分配的存储的顺序和连续性。 如果分配成功,则返回的指针被适当地对齐,以便可以将其指定给具有基本对齐要求的任何类型的对象的指针,然后用于在分配的空间中访问此类对象或此类对象的数组。 (直到空间被明确释放)。

这也声称是的,您可以使用*alloc以任何方式分配内存并将其分配给任何指针类型(要求fundamental alignment)。

同样在你可以看到的引用的突出显示部分中 - 通过指定用于访问此类对象的“或分配的空间中的此类对象数组来说明连续性。这也是通信参数的一个原因 - 因为在通话结束时你会得到一块连续的内存。 (总内存大小由传递的两个参数相乘指定。)