malloc函式的用法

2021-08-28 13:48:36 字數 2163 閱讀 8611

malloc函式是一種分配長度為num_bytes位元組的記憶體塊的函式,可以向系統申請分配指定size個位元組的記憶體空間。malloc的全稱是memory allocation(動態記憶體分配),當無法知道記憶體具體位置的時候,想要繫結真正的記憶體空間,就需要用到動態的分配記憶體。返回型別是 void* 型別。void* 表示未確定型別的指標。c,c++規定,void* 型別可以通過型別轉換強制轉換為任何其它型別的指標。

void *malloc(long numbytes):該函式分配了numbytes個位元組,並返回了指向這塊記憶體的指標。如果分配失敗,則返回乙個空指標(null)。分配失敗的原因,應該有多種比如說空間不足就是一種。

void free(void *firstbyte): 該函式是將之前用malloc分配的空間還給程式或者是作業系統,也就是釋放了這塊記憶體,讓它重新得到自由。

使用前要申明:#include 或者#include

如果在source code中沒有直接或者間接include過stdlib.h,那麼gcc就會報出error:『malloc』 was not declared in this scope。

其實這兩個函式用起來倒不是很難,也就是malloc()之後覺得用夠了就甩了它把它給free()了,舉個簡單例子:

// code...

char *ptr = null;

ptr = (char *)malloc(100 * sizeof(char));

if (null == ptr)

gets(ptr);

// code...

free(ptr);

ptr = null;

// code...

就是這樣!當然,具體情況要具體分析以及具體解決。比如說,你定義了乙個指標,在乙個函式裡申請了一塊記憶體然後通過函式返回傳遞給這個指標,那麼也許釋放這塊記憶體這項工作就應該留給其他函式了。

new返回指定型別的指標,並且可以自動計算所需要的大小。

int *p;

p = new int;   //返回型別為int *型別,分配的大小為sizeof(int)

p = new int[100];    //返回型別為int *型別,分配的大小為sizeof(int) * 100

而malloc則必須由我們計算位元組數,並且在返回的時候強轉成實際指定型別的指標。

int *p;

p = (int *)malloc(sizeof(int));

.......

free(p);

簡單的說:malloc 函式其實就是在記憶體中:找一片指定大小的空間,然後將這個空間的首位址給乙個指標變數,這裡的指標變數可以是乙個單獨的指標,也可以是乙個陣列的首位址, 這要看malloc函式中引數size的具體內容。我們這裡malloc分配的記憶體空間在邏輯上是連續的,而在物理上可以不連續。我們作為程式設計師,關注的 是邏輯上的連續,其它的,作業系統會幫著我們處理的。

關於該函式的原型,在以前malloc返回的是char型指標,新的ansic標準規定,該函式返回為void型指標,因此必要時要進行型別轉換。

如果分配成功則返回指向被分配記憶體的指標(此儲存區中的初始值不確定),否則返回空指標null。當記憶體不再使用時,應使用free()函式將記憶體塊釋放。函式返回的指標一定要適當對齊,使其可以用於任何資料物件。

malloc函式的實質體現在,它有乙個將可用的記憶體塊連線為乙個長長的列表的所謂空閒鍊錶。呼叫malloc函式時,它沿連線表尋找乙個大到足以滿足使用者請求所需要的記憶體塊。然後,將該記憶體塊一分為二(一塊的大小與使用者請求的大小相等,另一塊的大小就是剩下的位元組)。接下來,將分配給使用者的那塊記憶體傳給使用者,並將剩下的那塊(如果有的話)返回到連線表上。

呼叫free函式時,它將使用者釋放的記憶體塊連線到空閒鏈上。到最後,空閒鏈會被切成很多的小記憶體片段,如果這時使用者申請乙個大的記憶體片段,那麼空閒鏈上可能沒有可以滿足使用者要求的片段了。於是,malloc函式請求延時,並開始在空閒鏈上翻箱倒櫃地檢查各記憶體片段,對它們進行整理,將相鄰的小空閒塊合併成較大的記憶體塊。如果無法獲得符合要求的記憶體塊,malloc函式會返回null指標,因此在呼叫malloc動態申請記憶體塊時,一定要進行返回值的判斷。linux libc6採用的機制是在free的時候試圖整合相鄰的碎片,使其合併成為乙個較大的free空間。

參考資料

[1][2] 這篇寫的很詳細

malloc 函式的用法

函式宣告 函式原型 void malloc int size 說明 malloc 向系統申請分配指定size個位元組的記憶體空間。返回型別是 void 型別。void 表示未確定型別的指標。c,c 規定,void 型別可以強制轉換為任何其它型別的指標。從函式宣告上可以看出。malloc 和 new ...

malloc函式的用法

malloc 是記憶體分配 分配的空間以位元組為單位 sizeof int n 1 是求乙個位元組數的過程 sizeof int 就是int型別的位元組數,再 n 1 其實就是連續的n 1個int型數的空間所含的位元組數 前面二者合起來就是分配了大小為n 1個int型的空間所含的位元組數 此時 in...

malloc函式用法

void malloc int size 說明 malloc向系統申請分配size位元組的記憶體空間,返回型別為void 型別。int p p int malloc sizeof int 注意 1 因為malloc返回的是不確定型別的指標,所以返回之前必須經過型別強制轉換,否則編譯報錯,如 不能將v...