動態記憶體管理必要性
我們先看一下程式棧空間申請的陣列的空間有什麼特點?
正是需要在程式執行期間,動態的開闢調整和維護管理記憶體空間的需求才導致動態記憶體管理的必要性,動態申請的空間是在堆空間上的2
動態記憶體管理的相關函式
malloc
free
calloc
realloc
malloc
required header:and函式原型:void *malloc( size_t size );
malloc用於開闢size個位元組的連續的記憶體空間。返回值:開闢成功後返回void*型別的指標,開闢失敗返回null;引數size的意義是開闢連續的空間的總位元組大小。3
舉個例子:
#include
#include
#include
intmain()
以上**在堆上開闢了三個連續整形大小的空間,assert斷言一下arr_int,是為了防止空指標引用
free
required header:and函式原型:void free( void *memblock );
free函式用於釋放申請的堆空間。free函式沒有返回值;引數為要釋放的連續空間的首位址。4
上面展示malloc功能的**知道程式退出都沒有對已經申請的堆空間進行釋放,對動態記憶體的管理申請和釋放需要成對出現才不會導致記憶體洩露
舉個例子:
#include
#include
#include
intmain()
在程式結束之前就進行對申請的堆空間釋放
free(arr_int);
calloc
required header:and函式原型:void *calloc( size_t num, size_t size );
calloc函式用於申請初始化為0的堆空間。返回值是void*型別,是申請的連續空間的首位址;第乙個引數num是元素的個數,第二個引數size是乙個元素的大小。5
舉個例子:
#include
#include
#include
intmain()
以上**申請的三個整形大小的記憶體空間每個元素的初始值都是0
realloc
required header:and函式原型:void *realloc( void *memblock, size_t size );
realloc適用於調整已申請的記憶體空間大小。返回值是調整之後的記憶體空間位址;引數memblock是要調整的記憶體空間首位址型別void*,引數size是將要調整之後的記憶體空間位元組大小。6
舉個例子:
#include
intmain()
//遍歷
for(
int i =
0; i < size;
++i)
printf
("%d "
, space[i]);
printf
("\n");
free
(space)
;return0;
}以上**實現了無窮大小的陣列輸入的功能實現,只要電腦物理記憶體足夠,程式就一直可以動態調整堆空間大小不斷接收新的輸入並插入,需要注意的是,調整之後的記憶體空間還會將調整之前的資料移動到新空間,並且舊空間的記憶體不用手動去釋放↩︎
↩︎ 對於引數的解釋原英文:parameter:size is the bytes to allocate ↩︎
對於引數的解釋原英文:parameter:memblock is the previously allocated memory block to be freed↩︎
對於引數的解釋原英文:parameters:num is the number of elements,size is the length in bytes of each element ↩︎
對於引數的解釋原英文:parameters:memblock is the pointer to previously allocated memory block,size is the new size in bytes ↩︎
動態記憶體管理
首先應該明白物件的三種內部的儲存方式 自動儲存,靜態儲存,和動態儲存。當執行離開當期程式塊的時候,堆疊指標返回到它進入程式塊 之前的地方,有效的銷毀了那個程式塊的自動變數。重新進入這個塊會再次建立所有的自動變數。靜態物件宣告或者在檔案域中。動態物件是存在系統呼叫 的在執行期中建立並且儲存在堆中,這是...
動態 記憶體管理
定義變數時,必須制定其資料型別和名字。而動態建立物件時,只需指定其資料型別,而不必為該物件命名。取而代之的是,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...