calloc()
处理计数和大小参数的方式有何不同?例如:
// calloc() parms are "count", then "size"
ptr1 = calloc( 1, 20 );
ptr2 = calloc( 20, 1 );
显而易见的假设是,在内部它将两者相乘得到总字节数,并且实际上并不关心哪个是计数,哪个是大小。但这是真的吗?
两个参数之间是否存在细微差别,因此我们应该注意我们传入哪一个作为计数与大小?
(是的,我知道calloc可以通过使用2个参数来检测溢出,而malloc()则不能,但是这并没有回答我的问题。)
答案 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)。
同样在你可以看到的引用的突出显示部分中 - 通过指定用于访问此类对象的“或分配的空间中的此类对象数组来说明连续性。这也是通信参数的一个原因 - 因为在通话结束时你会得到一块连续的内存。 (总内存大小由传递的两个参数相乘指定。)