1. 程式人生 > >C語言malloc()函式與calloc()函式的區別

C語言malloc()函式與calloc()函式的區別

推薦部落格:

推薦部落格:https://blog.csdn.net/ddcodingya/article/details/80452397

 

推薦部落格:https:https://blog.csdn.net/Hackbuteer1/article/details/6789164

函式malloc()和函式colloc()都可以用來動態分配記憶體空間.

malloc() 函式有一個引數,是需要分配空間的大小(單位是位元組)

 char *mem = (char *)malloc(sizeof(char)*newsize);    //開闢記憶體

calloc()函式有兩個引數,第一個引數是元素的數目,第二個是每個元素的大小

 

<1>從靜態儲存區域分配.
       記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在.例如全域性變數、static變數.
<2>在棧上建立
       在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放.棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限.

<3>從堆上分配,亦稱動態記憶體分配.
       程式在執行的時候用malloc或new申請任意多少的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體.動態記憶體的生存期由使用者決定,使用非常靈活,但問題也最多.

關於函式使用需要注意的一些地方:

標頭檔案:malloc.h或者stdlib.h

A、申請了記憶體空間後,必須檢查是否分配成功。

B、當不需要再使用申請的記憶體時,記得釋放;釋放後應該把指向這塊記憶體的指標指向NULL,
防止程式後面不小心使用了它。

C、這兩個函式應該是配對。如果申請後不釋放就是記憶體洩露;如果無故釋放那就是什麼也沒有做。
釋放只能一次,如果釋放兩次及兩次以上會

出現錯誤(釋放空指標例外,釋放空指標其實也等於啥也沒做,所以釋放空指標釋放多少次都沒有問題)。

D、雖然malloc()函式的型別是(void *),任何型別的指標都可以轉換成(void *),
但是最好還是在前面進行強制型別轉換,因為這樣可以躲過一些編譯器的檢查。