Linux 之動態分配記憶體方式

2021-08-25 02:56:51 字數 1177 閱讀 9894

(1)malloc/free 函式

malloc()函式和free()函式是在堆中申請或釋放記憶體空間的,其函式宣告如下:

#include extern void* malloc(size_t _size);

extern void free(void* _ptr);

malloc()函式在堆中申請分配乙個長度為_size位元組的連續空間,若申請成功,則返回乙個指向該區域的首位址的指標,若申請失敗則返回null,且在使用完後,需要人為呼叫free()函式進行釋放。

(2)realloc()函式

realloc()函式是用來在堆中更改已經分配的記憶體空間的,其函式宣告如下:

#include extern void* realloc(void* ptr,size_t size);
函式的第乙個引數ptr為原堆指標位址,第二個引數size為新的記憶體大小,函式呼叫成功則返回新堆位址,否則返回null,且此時原堆指標仍可用。

如果呼叫該函式的目的只是減小原堆大小,realloc函式僅僅修改索引資訊,原堆指標不變,但減少部分的記憶體空間會交給系統進行**,不可再用。

但如果目的是擴大原堆大小,將可能有以下幾種情況之一發生:

如果當前記憶體段後面擁有足夠需要的記憶體,則直接擴充套件原堆大小,原堆的指標不變。

如果當前記憶體段後面的記憶體大小不夠,那麼將 在堆中尋找第乙個滿足條件的記憶體塊,並將原堆資料複製到新堆中,釋放掉原堆指標(系統自動釋放,切記不可人為再次釋放),並返回新堆位址。

申請失敗,返回null,但原堆指標仍可用。

(3)calloc()函式

calloc()函式是malloc()的簡單封裝,它相對於malloc()函式的主要優點是在動態分配記憶體後,緊接著把這塊記憶體初始化為0(這很重要,這時候記憶體才是真正分配成功)。

(4)alloca()函式

alloca()函式是在棧中,而不是堆中,分配記憶體空間的,因此使用完後,系統會自動釋放掉該空間,不需要人為再次釋放。同malloc()一樣,分配成功返回對應指標,失敗則返回null。

記憶體動態分配

陣列的元素儲存於記憶體中連續的位置上。當乙個陣列被宣告時,它所需要的內存在編譯時就被分配。但是,你也可以使用動態記憶體分配在執行時為它分配記憶體。malloc所分配的是一塊連續的記憶體。例如,如果請求它分配100個位元組的記憶體,那麼它實際分配的記憶體就是100個連續的位元組,並不會分開位於兩塊或多...

動態分配記憶體

動態記憶體分配即分配記憶體大小在執行時才確定,一般在堆中分配。c語言動態記憶體分配相關的函式。include void malloc size t size malloc的使用比較直接,乙個成功的malloc呼叫返回分配的size大小的記憶體的指標。失敗時返回null並將錯誤 置為enomem。教材...

動態分配記憶體

動態分配記憶體 動態分配記憶體也可以分配儲存區,這種方式可以在程式執行的時候臨時決定分配的儲存區大小 為了管理動態分配的記憶體,就需要使用一組標準函式 為了使用這些標準函式,需要包含stdlib.h標頭檔案 malloc 函式可以動態分配一組連續的位元組 這個函式需要乙個整數型別引數表示分配的位元組...