準備:動態記憶體分配
一、為什麼用動態記憶體分配
但我們未學習鍊錶的時候,如果要儲存數量比較多的同型別或同結構的資料的時候,總是使用乙個陣列。比如說我們要儲存乙個班級學生的某科分數,總是定義乙個float型(存在0.5分)陣列:
float score[30];
但是,在使用陣列的時候,總有乙個問題困擾著我們:陣列應該有多大?
在很多的情況下,你並不能確定要使用多大的陣列,比如上例,你可能並不知道該班級的學生的人數,那麼你就要把陣列定義得足夠大。這樣,你的程式在執行時就申請了固定大小的你認為足夠大的記憶體空間。即使你知道該班級的學生數,但是如果因為某種特殊原因人數有增加或者減少,你又必須重新去修改程式,擴大陣列的儲存範圍。這種分配固定大小的記憶體分配方法稱之為靜態記憶體分配。但是這種記憶體分配的方法存在比較嚴重的缺陷,特別是處理某些問題時:在大多數情況下會浪費大量的記憶體空間,在少數情況下,當你定義的陣列不夠大時,可能引起下標越界錯誤,甚至導致嚴重後果。
那麼有沒有其它的方法來解決這樣的外呢體呢?有,那就是動態記憶體分配。
所謂動態記憶體分配就是指在程式執行的過程中動態地分配或者**儲存空間的分配記憶體的方法。動態記憶體分配不象陣列等靜態記憶體分配方法那樣需要預先分配儲存空間,而是由系統根據程式的需要即時分配,且分配的大小就是程式要求的大小。從以上動、靜態記憶體分配比較可以知道動態記憶體分配相對於景泰記憶體分配的特點:
1、不需要預先分配儲存空間;
2、分配的空間可以根據程式的需要擴大或縮小。
二、如何實現動態記憶體分配及其管理
要實現根據程式的需要動態分配儲存空間,就必須用到以下幾個函式
1、malloc函式
malloc函式的原型為:
void *malloc (unsigned int size)
其作用是在記憶體的動態儲存區中分配乙個長度為size的連續空間。其引數是乙個無符號整形數,返回值是乙個指向所分配的連續儲存域的起始位址的指標。還有一點必須注意的是,當函式未能成功分配儲存空間(如記憶體不足)就會返回乙個null指標。所以在呼叫該函式時應該檢測返回值是否為null並執行相應的操作。
下例是乙個動態分配的程式:
#include
#include
main()
for (count=0;count〈10;count++) /*給陣列賦值*/
array[count]=count;
for(count=0;count〈10;count++) /*列印陣列元素*/
printf("%2d",array[count]);
}上例中動態分配了10個整型儲存區域,然後進行賦值並列印。例中if((array(int *) malloc(10*sizeof(int)))==null)語句可以分為以下幾步:
1)分配10個整型的連續儲存空間,並返回乙個指向其起始位址的整型指標
2)把此整型指標位址賦給array
3)檢測返回值是否為null
2、free函式
由於記憶體區域總是有限的,不能不限制地分配下去,而且乙個程式要盡量節省資源,所以當所分配的記憶體區域不用時,就要釋放它,以便其它的變數或者程式使用。這時我們就要用到free函式。
其函式原型是:
void free(void *p)
作用是釋放指標p所指向的記憶體區。
其引數p必須是先前呼叫malloc函式或calloc函式(另乙個動態分配儲存區域的函式)時返回的指標。給free函式傳遞其它的值很可能造成宕機或其它災難性的後果。
注意:這裡重要的是指標的值,而不是用來申請動態記憶體的指標本身。例:
int *p1,*p2;
p1=malloc(10*sizeof(int));
p2=p1;
……free(p2) /*或者free(p2)*/
malloc返回值賦給p1,又把p1的值賦給p2,所以此時p1,p2都可作為free函式的引數。
malloc函式是對儲存區域進行分配的。
free函式是釋放已經不用的記憶體區域的。
所以由這兩個函式就可以實現對記憶體區域進行動態分配並進行簡單的管理了。
C語言之動態記憶體分配
對記憶體的動態分配是通過系統提供的庫函式來實現的,主要有malloc calloc free realloc這4個函式。1 malloc函式 函式原型為void malloc unsigned int size 其作用是在記憶體的動態儲存區中分配乙個長度為size的連續空間。此函式是乙個指標型函式,...
c語言動態記憶體分配 C 動態記憶體分配
動態記憶體分配 雖然通過陣列就可以對大量的資料和物件進行有效地管理,但是很多情況下,在程式執行之前,我們並不能確切地知道陣列中會有多少個元素。這種情況下,如果陣列宣告過大,就會造成浪費 宣告過小,就會影響處理。在c 中,動態記憶體分配技術可以保證程式在執行過程中按照需要申請適量記憶體,使用後釋放,從...
C語言之動態記憶體分配與釋放
1,堆記憶體特點 堆記憶體可以存放任意型別的資料,但需要自己申請與釋放。2,堆大小 堆大小,想像中的無窮大,但實際使用中,受限於實際記憶體的大小和記憶體是否有連續性。1,malloc函式 2,calloc函式 3,realloc函式 4,free函式 示例 include include int m...