Q有什么区别calloc和malloc?我应该使用哪个?利用calloc的零填充是否安全?free是否适用于用calloc分配的内存,还是需要cfree?
A calloc(m, n)基本上等同于
p = malloc(m * n); memset(p, 0, m * n);
除了参数数量和零填充外,两者之间没有重要区别。[脚注]
使用方便的函数即可。不要过度依赖calloc的零填充(见下文);通常,最好自己初始化数据结构,逐个字段初始化,特别是当存在指针字段时。
calloc的零填充是所有位都为零,因此保证为所有整数类型(包括'\0'字符类型)生成值 0。但它并不能保证有用的空指针值(参见本列表的第 5 节)或浮点零值。
free被正确地用于释放由calloc分配的内存;没有标准的cfree函数。
一个被想象出来的、但不重要的区别在于malloc和calloc是分配单个元素还是分配一个元素数组。尽管calloc的双参数调用约定表明它应该用于分配一个大小为n的m个元素的数组,但没有这样的要求;完全允许使用calloc(通过传递一个参数为 1)分配一个元素,或者使用malloc(通过自己执行乘法;例如,参见问题6.14 的代码片段)分配一个数组。 (结构填充也不影响这个问题;使结构数组正常工作的任何必要的填充始终由编译器处理,并由sizeof反映。参见问题2.13。)
参考文献:ISO Sec. 7.10.3 to 7.10.3.2
H&S Sec. 16.1 p. 386, Sec. 16.2 p. 386
PCS Sec. 11 pp. 141,142