我們所掌握的記憶體開闢方式主要分為型別的定義和陣列開闢
eg:int val = 10;//在棧上開闢四個位元組
char array[10] = ;//在棧上用陣列開闢了十個位元組的連續空間
上述開闢空間的方法其開闢大小是固定的,陣列在宣告的時候,必須指定陣列長度。但對空間的需求,是在程式執行時才能知道,無法準確定義空間大小,可能會存在空間分配過小,記憶體不足或者空間過大,記憶體浪費的問題,所以延伸出動態記憶體分配。
記憶體分配的主要函式有:malloc,realloc,calloc,c++中則使用new
存分配的主要函式有:free,c++中則使用delete
malloc和free
malloc的函式介面:void* malloc(size_t size);
這個函式向記憶體申請一塊連續可用的空間,並返回指向這塊空間的指標。
如果開闢成功,則返回乙個指向開闢好空間的指標。
如果開闢失敗,則返回乙個null指標,因此malloc的返回值一定要做檢查。
返回值的型別是 void* ,所以malloc函式並不知道開闢空間的型別,具體在使用的時候使用者自己來決定。
free函式用來釋放動態開闢的記憶體。
如果引數 ptr 指向的空間不是動態開闢的,那free函式的行為是未定義的。
如果引數 ptr 是null指標,則函式什麼事都不做。
上面這段我演示了malloc申請和free釋放的過程,我們應該注意**裡的一些細節:
malloc申請的函式其返回值的型別為void*,我們需要將其強轉成我們指標所需要的型別,且malloc申請空間大小是按位元組來計算的,並不是字元的個數
申請空間完成後,應該對指標所指向的空間進行判空,看是否申請成功
空間使用完畢必須進行釋放,防止實現記憶體洩漏,且指標需再次置空,以免出現野指標的問題
c語言還提供了乙個函式叫 calloc , calloc 函式也用來動態記憶體分配。
calloc函式介面:void* calloc(size_t num,size_t size);
函式的功能是為 num 個大小為 size 的元素開闢一塊空間,並且把空間的每個位元組初始化為0。
calloc和malloc的區別:
與函式 malloc 的區別只在於 calloc 會在返回位址之前把申請的空間的每個位元組初始化為全0。舉個例子:
上述是其申請空間的用法,後面步驟與malloc用法相同,不在詳細描述。所以如果我們對申請記憶體空間內容要求初始化,那麼可以使用calloc函式來完成任務。
realloc
realloc函式的出現讓動態記憶體管理更加靈活。
有時會我們發現過去申請的空間太小了,有時候我們又會覺得申請的空間過大了,那為了合理的時候記憶體,
我們一定會對記憶體的大小做靈活的調整。那 realloc 函式就可以做到對動態開闢記憶體大小的調整。
realloc函式介面:void* realloc(void* ptr,size_t size);
ptr 是要調整的記憶體位址
size 調整之後新大小
返回值為調整之後的記憶體起始位置。
這個函式調整原記憶體空間大小的基礎上,還會將原來記憶體中的資料移動到 新 的空間。
realloc在調整記憶體空間的是存在兩種情況:
情況1:原有空間之後有足夠大的空間
情況2:原有空間之後沒有足夠大的空間
常見realloc多是適用於指標所指向的空間不足時擴容
舉個栗子:
若不使用realloc,要實現函式增容則要進行以下幾步:1.開闢新空間,2.將就空間元素拷貝到新空間3.釋放就空間
使用realloc則更加方便,**更簡單。
以上便是常用動態記憶體開闢的函式及其使用方法,malloc模組中詳細敘述了動態記憶體分配的流程及方法,還有其中的陷阱。
C語言動態記憶體管理
1 概述 動態儲存管理的基本問題是 系統如何按請求分配記憶體,如何 記憶體再利用。提出請求的使用者可能是系統的乙個作業,也可能是程式中的乙個變數。空閒塊 未曾分配的位址連續的記憶體區稱為 空閒塊 占用塊 已分配給使用者使用的位址連續的記憶體區稱為 占用塊 系統剛剛啟動時,整個記憶體可看做乙個大的 空...
C語言動態記憶體管理
c系統的函式庫中提供了了程式動態申請和釋放記憶體儲存塊的庫函式,下面將分別介紹。1 malloc 函式 a 該函式的原型 void malloc size t size b 該函式只有乙個引數,且形參size是無符號整型,該引數代表申請空間的位元組數。c 返回值 如果記憶體池中的可用記憶體滿足需求,...
C語言動態記憶體管理
在說明c語言記憶體管理之前,要知道什麼是記憶體,記憶體我個人認為可以理解為帶有標籤的盒子,所謂的帶標籤的盒子就像我們住的寢室一樣有門牌號,盒子內只能儲存固定型別的資料或變數,就如男生寢室只能住男生一樣。那麼c語言中有多少種盒子呢?有靜態儲存區 動態儲存區 內部暫存器區域。我們通常定義的變數如果沒有特...