動態記憶體管理

2021-10-07 21:47:07 字數 2220 閱讀 7009

為什麼要進行動態記憶體分配

在棧上開闢的空間,大小是固定的。如果需要的記憶體過多,則會出現記憶體不夠用的情況,如果需要的過少,則會出現記憶體浪費的情況。

基於在棧上開闢空間的侷限性,有時候我們需要的空間大小在程式執行的時候才能知道,那陣列的編譯時開闢空間的方式就不能滿足,這時候就只能試試動態存開闢。

動態記憶體開闢的函式

動態記憶體開闢的函式一共有三個,分別是: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...