prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 7.31

Q有什么区别callocmalloc?我应该使用哪个?利用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函数。

一个被想象出来的、但重要的区别在于malloccalloc是分配单个元素还是分配一个元素数组。尽管calloc的双参数调用约定表明它应该用于分配一个大小为nm个元素的数组,但没有这样的要求;完全允许使用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


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管