為什麼要進行動態記憶體分配在棧上開闢的空間,大小是固定的。如果需要的記憶體過多,則會出現記憶體不夠用的情況,如果需要的過少,則會出現記憶體浪費的情況。
基於在棧上開闢空間的侷限性,有時候我們需要的空間大小在程式執行的時候才能知道,那陣列的編譯時開闢空間的方式就不能滿足,這時候就只能試試動態存開闢。
動態記憶體開闢的函式動態記憶體開闢的函式一共有三個,分別是:malloc、calloc、realloc,這三個函式有乙個共同的特點,就是在使用完成後均需要用free函式釋放,否則會造成記憶體洩漏。
malloc
用法如下:
void
* malloc (size_t size)
;
malloc函式向記憶體申請一塊連續可用的空間,並返回指向這塊空間的指標。因為不知道記憶體是否開闢成功,所以開闢後要進行檢查,如果開闢成功,則返回乙個指向開闢好空間的指標。 如果開闢失敗,則返回乙個null指標。
舉例:
#include
#include
#include
#pragma warning(disable:4996)
intmain()
;int
*ptr =
null
; ptr =
(int*)
malloc
(num*
sizeof
(int))
;if(null
!= ptr)
}free
(ptr)
;system
("pause");
return0;
}
2.calloc
用法如下:
void
* calloc (size_t num, size_t size);
calloc也是用作動態記憶體分配的,跟malloc用法基本一致,有一點區別就是,calloc在用時會做初始化,初始化全部為0,但是malloc在用時並沒有這一步驟。所以如何我們對申請的記憶體空間的內容要求初始化,那麼可以很方便的使用calloc函式來完成任務。 但是也不是說能夠初始化就是好事,也要看自己的需求,不能盲目使用。
舉例:
#include
#include
#include
intmain()
free
(p);
system
("pause");
p =null
;return0;
}
realloc
用法如下:
void
* realloc (
void
* ptr, size_t size)
;
realloc也是申請空間的,但是它更加靈活,它可以調整申請空間的大小。ptr 是要調整的記憶體位址,size 調整之後新大小。返回值為調整之後的記憶體起始位置。 這個函式調整原記憶體空間大小的基礎上,還會將原來記憶體中的資料移動到新的空間。
realloc在調整記憶體空間的是存在兩種情況:要麼原有空間之後有足夠大的空間(要擴充套件記憶體就直接原有記憶體之後直接追加空間,原來空間的資料不發生變化),要麼沒有足夠大的空間(原有空間之後沒有足夠多的空間時,擴充套件的方法是:在堆空間上另找乙個合適大小的連續空間來 使用。這樣函式返回的是乙個新的記憶體位址。 )。
#include
#include
#include
intmain()
else
int*p =
null
; p =
realloc
(ptr,
100);if
(p !=
null
)free
(ptr)
;system
("pause");
return0;
}
柔性陣列特點:
結構中的柔性陣列成員前面必須至少乙個其他成員。
sizeof 返回的這種結構大小不包括柔性陣列的記憶體。
包含柔性陣列成員的結構用malloc ()函式進行記憶體的動態分配,並且分配的記憶體應該大於結構的大小,以適應柔性陣列的預期大小。
動態記憶體管理
首先應該明白物件的三種內部的儲存方式 自動儲存,靜態儲存,和動態儲存。當執行離開當期程式塊的時候,堆疊指標返回到它進入程式塊 之前的地方,有效的銷毀了那個程式塊的自動變數。重新進入這個塊會再次建立所有的自動變數。靜態物件宣告或者在檔案域中。動態物件是存在系統呼叫 的在執行期中建立並且儲存在堆中,這是...
動態 記憶體管理
定義變數時,必須制定其資料型別和名字。而動態建立物件時,只需指定其資料型別,而不必為該物件命名。取而代之的是,new表示式返回指向新建立物件的指標,我們通過該指標來訪問此物件。int i int pi new int 這個new表示式在自由儲存區中分配建立了乙個整型物件,並返回此物件的位址,並用該位...
動態記憶體管理
c語言使用malloc calloc realloc free進行動態記憶體管理。void test c 通過new和delete動態管理記憶體。new delete動態管理物件。new delete動態管理物件陣列。void test void test int globalvar 1 stati...