做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就是個謎一樣的存在。
這個網址(http://www.cnblogs.com/ecizep/p/4417573.html)中在比較二者時有這么一段描寫敘述:
“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; }
看了這段代碼。能表達我心情的僅僅有呵呵二字了