做的有什么区别:
ptr = (char **) malloc (MAXELEMS * sizeof(char *));
Run Code Online (Sandbox Code Playgroud)
要么:
ptr = (char **) calloc (MAXELEMS, sizeof(char*));
Run Code Online (Sandbox Code Playgroud)
什么时候使用calloc而不是malloc是一个好主意,反之亦然?
为什么要calloc采用两个参数而不是一个malloc?
具体来说,由于以下表达式之间没有区别(或存在?):
calloc (a, b);
calloc (b, a);
calloc (a * b, 1);
calloc (1, a * b);
Run Code Online (Sandbox Code Playgroud)
为什么不接受要分配的总字节数?这个界面背后的理由是什么?为什么这不适用于malloc?
有很多资源描述了malloc和之间的功能差异calloc,但我不能轻易找到描述不同功能签名背后的历史的资源:
void *calloc(size_t nmemb, size_t size);
void *malloc(size_t size);
Run Code Online (Sandbox Code Playgroud)
当然,size前者是每个成员的大小.也许这个想法是可以通过操作系统懒散地完成多页面大小的成员大小的calloc?
(我可以弥补原因以及下一个人 - 没有引用来源没有接受的答案.:-)
我注意到这有很多C函数调用,特别是处理内存或文件操作的函数,但并非所有函数都使用这两个参数.例如,malloc传递一个参数,即所需内存空间的大小(以字节为单位).另一方面,Calloc传递两个参数,一个元素的字节大小和元素的数量(大小和nmem).还有其他函数也使用这些大小和nmem参数.
从本质上讲,calloc调用将分配与调用malloc(nmem size)相同的内存量,因此所有真正发生的事情是asterisk()被替换为逗号(,).至少这是我能从更高层面告诉我的工作.我没有看到调用calloc(1,nmem size),calloc(nmem size,1)或calloc(nmem,size)的区别.
是否有一些实际发生在较低级别的事情使调用calloc(1,nmem*size)与calloc(nmem,size)根本不同?
编辑:我知道calloc和malloc之间的功能差异.我很感兴趣为什么参数有差异.还有其他函数使用2个大小参数作为总大小(fread,fwrite等).我并不关心具体的功能,而是为什么函数中使用的总大小有两个参数,而基本上总大小变成两个参数相乘.我发现大多数时候使用这些函数时,我使用"size"参数中需要的大小,"nmem"(有时是"count"等)参数使用"1".