摘自:
做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的源**。
摘抄**例如以下:
1 #include "ansidecl.h
"2 #include 34/*
for systems with larger pointers than ints, this must be declared.
*/5 ptr malloc
(size_t);
6void
bzero (ptr, size_t);
78 ptr calloc
(size_t nelem, size_t elsize)
9
看了這段**。能表達我心情的僅僅有呵呵二字了
malloc 和 calloc 的區別
void calloc size t num elements,size t element size void malloc size t size calloc和malloc都用於分配記憶體。1.malloc函式 malloc函式可以從堆上獲得指定位元組的記憶體空間,其函式宣告如下 void m...
malloc和calloc的區別
函式 malloc 和calloc 都可以用來動態分配記憶體空間 但兩者稍有區別。malloc 函式有乙個引數 即要分配的記憶體空間的大小 void malloc size t size calloc 函式有兩個引數 分別為元素的數目和每個元素的大小 這兩個引數的乘積就是要分配的記憶體空間的大小。v...
malloc 和calloc 的區別
malloc 和calloc 的區別 1 函式引數 函式malloc 和calloc 都可以用來動態分配記憶體空間,但兩者稍有區別。malloc 函式有乙個引數,即要分配的記憶體空間的大小 void malloc size t size calloc 函式有兩個引數,分別為元素的數目和每個元素的大小...