c語言中的動態記憶體管理

2021-08-03 15:35:00 字數 1378 閱讀 5423

malloc、calloc、realloc的區別與聯絡

在c語言/c++中和記憶體申請與釋放的相關函式有:alloc、malloc、calloc、realloc、free.

1》alloc是在棧上申請空間,無需使用者主動釋放,當函式執行結束時,在棧上分配的記憶體會被自動釋放,棧記憶體分配運算內置於處理器的指令集中,效率很高,但分配的記憶體有限。

2》malloc在堆上申請分配記憶體,並且沒有初始化記憶體的內容,因此要呼叫memset函式來初始化這部分記憶體空間。

3》calloc也是在堆上申請記憶體,和malloc類似,但是會初始化申請到的記憶體,設定為0.

4》realloc在堆上申請空間,對malloc申請的空間大小進行調整,若原來沒有申請空間,則作用和malloc相同。

所有在堆上申請的空間都要通過free函式釋放,如果在堆上申請了空間而沒有用free函式來釋放,就會造成記憶體洩漏。一部分記憶體沒有在使用,但是因為沒有free導致系統仍認為這部分記憶體還在使用,造成向系統不斷申請記憶體但不釋放,使得系統中可用記憶體不斷減少,但是記憶體洩漏僅僅指在程式執行時,程式退出時,os將會**所有資源。但對某些系統常駐程序而言,要是存在記憶體洩漏則往往是致命的。

函式原型:

void* malloc (size_t size);

void* calloc (size_t num, size_t size);

void* realloc (void* ptr, size_t size);

這三個函式的標頭檔案均為,這三個函式的返回值都是請求系統分配的位址,若請求失敗則返回null.

1> malloc函式:在記憶體的動態儲存區中分配一塊長度為size位元組的連續區域,引數size為需要記憶體空間的長度,返回該區域的首位址。

2> calloc函式:和malloc類似,引數size為申請位址的元素型別的大小(即單個元素的長度),num為要申請的元素的個數,則最後在記憶體中申請的空間為num*size位元組大小的連續的位址空間。並且用0初始化每個元素

3> realloc函式:對給定的指標所指向的空間進行擴大或縮小,且無論進行哪種操作原有記憶體中的內容都會保持不變。當然縮小後,超出的那部分內容會被丟棄。realloc並不保證調整後的記憶體空間和原來的記憶體空間保持統一記憶體位址,也就是說realloc函式返回的指標很可能會指向乙個新的位址。

分析:

1> 上面三個函式返回的都是void*型別,void*表示未確定型別的指標,而c和c++規定,void*型別可以強制轉換為任何其他型別的指標。

2> realloc函式可以從堆上分配記憶體,當要擴大一塊記憶體空間時,realloc函式試圖直接從堆上現存資料後面的那些位元組中獲得附加的位元組,如果可以滿足則最好,如果資料後面的位元組不夠,那麼就使用堆上第乙個足夠大的可以分配的記憶體塊,然後將原內資料拷貝到新的記憶體,而老的記憶體裡的資料不懂只是和指標失去聯絡而被放回記憶體池。

c語言中的動態記憶體管理

malloc通常用來開闢一段連續記憶體空間 void malloc size t size 1 如果記憶體開闢成功,則返回乙個指向開闢好空間的指標 2 如果開闢失敗,則返回乙個null指標,因此malloc的返回結果必須判空 3 由於返回值型別為void 具體使用時根據自身需要強制型別轉換 4 如果...

簡述C語言中的動態記憶體管理

目錄 為什麼要進行動態記憶體管理 動態記憶體開闢函式 malloc和free calloc realloc 常見的動態記憶體錯誤 普通常見的記憶體開闢的方法有 int val 10 在棧空間上開闢四個位元組 char arr 10 在棧空間上開闢10個位元組的連續空間但是上述方法有兩個不足之處 有時...

C語言中動態記憶體管理方式。

c語言中關於動態記憶體管理的方式有三種,他們分別是malloc,calloc.realloc,雖然說他們都可以進行動態記憶體申請,但是他們之間還有一些相同之處,和不同之處。下面我們可以簡要的說明一下 三個函式的宣告分別是 void malloc size t size 1 函式malloc 在記憶體...