做C这么久了,才了解calloc函数也是挺丢人的。
从网上找了非常多关于这两者差别的文章。有的甚至总结了好多人的结论。但我感觉都没有说的非常明确。
当中关于函数原型的差别根本就不是必需再讨论了,是个人都能看出參数不一样。须要讨论的是从原型中反应出的问题。
从原型上看,malloc的含义是“给我一个大小为size的连续内存”,而calloc貌似是“给我n个大小为size的内存”。
因为这种原型。有人说(不知道是不是官方也这么说)calloc返回的对象数组而malloc仅仅是一块连续的内存。
这让我产生了非常大的迷惑。为什么返回值仅仅有一个?难道返回的是数组的首地址,数组里面存的是分配的n块内存的地址?难道calloc的n个大小为size的连续内存,在这n个之间却可能是不连续的?假设是这样对这块内存怎么释放呢?“n个大小为size的内存”这句话本身就有歧义(是“一块内存大小是n个size”呢?还是“n块内存每块大小为size”),带着这些疑问我看了看用calloc申请的内存是怎样用free来释放的,结果是跟malloc一样仅仅free一次就够了。这个结果瞬间让我认为calloc就是个谜一样的存在。
这个网址中在比較二者时有这么一段描写叙述:
“malloc在分配内存的时候会保留一定的空间用来记录分配情况,分配的次数越多,这些记录占用的空间就越多。另外,依据malloc实现策略的不同,malloc每次在分配的时候,可能分配的空间比实际要求的多些。多次分配会导致很多其它的这样的浪费,当然,这些都跟malloc的实现有关”。
记录内存的使用情况是非常正常的啊,要不内存怎么用free来释放呢?可是这里强调malloc的这一点却没有说calloc,难道calloc不用记录?那么free是怎样释放用它申请的空间的?calloc究竟是个什么?太奇妙了,我该看看calloc的源代码。
从以下这个网址我找到了一段calloc的源代码(apple的地址至少还稍具权威性),尽管实现方式有多种,但这段代码就足以可以说明calloc是什么了:
http://www.opensource.apple.com/source/gcc/gcc-5575.11/libiberty/calloc.c
摘抄代码例如以下:
#include "ansidecl.h" #include <stddef.h> /* For systems with larger pointers than ints, this must be declared. */ PTR malloc (size_t); void bzero (PTR, size_t); PTR calloc (size_t nelem, size_t elsize) { register PTR ptr; if (nelem == 0 || elsize == 0) nelem = elsize = 1; ptr = malloc (nelem * elsize); if (ptr) bzero (ptr, nelem * elsize); return ptr; }
看了这段代码。能表达我心情的仅仅有呵呵二字了