C語言中怎樣實現動態記憶體管理

2021-10-22 06:51:38 字數 1883 閱讀 5960

在學習c語言中,當我們初次遇到在堆區開闢空間變數時,我們可能會提出為什麼要專門在堆區開闢變數呢,不是在棧區開闢記憶體更加容易麼?相反在堆區開闢空間時既要malloc,使用完空間後又要free這個空間,以及將開闢空間返回的位址置null,如果不這樣按照步驟做的話有可能會導致記憶體洩漏,由此看來使用堆區這麼麻煩的事情為什麼我們還樂此不疲的使用呢,原因在於在棧區在開闢的變數或者陣列的大小是固定的,有時候我們需要的空間大小在程式執行的時候才能知道,那陣列的編譯時開闢空間的方式就不能滿足了。 這時候就只能試試動態存開闢了,如當我們在寫乙個通訊錄的時建立通訊錄中存放人的資訊陣列的大小時,我們可能不知道在通訊錄中會儲存多少個人的資訊,如果儲存人的資訊陣列為固定1000的時而我們只存放50人資訊,這就浪費了空間的記憶體,如下圖所示。

通常c語言提供了三種開闢空間的方式malloc ,calloc,以及realloc。

malloc 的函式原型為 voidmalloc(size_t size);

1、如果開闢成功,則返回乙個指向開闢好空間的指標。

2、如果開闢失敗,則返回乙個null指標,因此malloc的返回值一定要做檢查。

3、返回值的型別是 void ,所以malloc函式並不知道開闢空間的型別,具體在使用的時候使用者自己來決定。

4、如果引數 size 為0,malloc的行為是標準是未定義的,取決於編譯器。

而calloc的用法與malloc的用法使用方法相同,區別只在於 calloc 會在返回位址之前把申請的空間的每個位元組初始化為全0。而realloc函式的出現讓動態記憶體管理更加靈活。有時會我們發現過去申請的空間太小了,有時候我們又會覺得申請的空間過大了,那為了合理的利用記憶體,我們一定會對記憶體的大小做靈活的調整。那 realloc 函式就可以做到對動態開闢記憶體大小的調整。 函式原型

void* realloc (void* ptr, size_t size); 第乙個引數是要調整位址的大小,第二個為調整之後新的大小,而realloc在調整記憶體大小時可能會出現下面兩種情況

當是情況1 的時候,要擴充套件記憶體就直接原有記憶體之後直接追加空間,原來空間的資料不發生變化。 當是情況

是情況2 的時候,原有空間之後沒有足夠多的空間時,擴充套件的方法是:在堆空間上另找乙個合適大小的連續空間來

使用。這樣函式返回的是乙個新的記憶體位址所以realloc函式在使用完畢後要對其返回的位址做檢查,如下程式所示

#include

intmain()

}else

ptr=

realloc

(p,(

100*

sizeof

(int))

);if(ptr!=

null

)else

return0;

}

最後c語言一般將記憶體劃分為以下幾個區域如下圖所示

1、棧區(stack):在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。 棧區主要存放執行函式而分配的區域性變數、函式引數、返回資料、返回位址等。

2.、堆區(heap):一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os** 。分配方式類似於鍊錶。

3.、資料段(靜態區)(static)存放全域性變數、靜態資料。程式結束後由系統釋放。

4、**段:存放函式體(類成員函式和全域性函式)的二進位制**。

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

malloc calloc realloc的區別與聯絡 在c語言 c 中和記憶體申請與釋放的相關函式有 alloc malloc calloc realloc free.1 alloc是在棧上申請空間,無需使用者主動釋放,當函式執行結束時,在棧上分配的記憶體會被自動釋放,棧記憶體分配運算內置於處理器...

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

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

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

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