| 導購 | 订阅 | 在线投稿
分享
 
 
 

鏈表的C語言實現之動態內存分配

來源:互聯網  2008-06-01 02:05:07  評論

一、爲什麽用動態內存分配

但我們未學習鏈表的時候,假如要存儲數量比較多的同類型或同結構的數據的時候,總是使用一個數組。比如說我們要存儲一個班級學生的某科分數,總是定義一個float型(存在0.5分)數組:

float score[30];

但是,在使用數組的時候,總有一個問題困擾著我們:數組應該有多大?在很多的情況下,你並不能確定要使用多大的數組,比如上例,你可能並不知道該班級的學生的人數,那麽你就要把數組定義得足夠大。這樣,你的程序在運行時就申請了固定大小的你認爲足夠大的內存空間。即使你知道該班級的學生數,但是假如因爲某種非凡原因人數有增加或者減少,你又必須重新去修改程序,擴大數組的存儲範圍。這種分配固定大小的內存分配方法稱之爲靜態內存分配。但是這種內存分配的方法存在比較嚴重的缺陷,非凡是處理某些問題時:在大多數情況下會浪費大量的內存空間,在少數情況下,當你定義的數組不夠大時,可能引起下標越界錯誤,甚至導致嚴重後果。

那麽有沒有其它的方法來解決這樣的外呢體呢?有,那就是動態內存分配。

所謂動態內存分配就是指在程序執行的過程中動態地分配或者回收存儲空間的分配內存的方法。動態內存分配不象數組等靜態內存分配方法那樣需要預先分配存儲空間,而是由系統根據程序的需要即時分配,且分配的大小就是程序要求的大小。從以上動、靜態內存分配比較可以知道動態內存分配相對于景泰內存分配的特點:

1、不需要預先分配存儲空間;

2、分配的空間可以根據程序的需要擴大或縮小。

二、如何實現動態內存分配及其治理

要實現根據程序的需要動態分配存儲空間,就必須用到以下幾個函數

1、malloc函數

malloc函數的原型爲:

void *malloc (unsigned int size)

其作用是在內存的動態存儲區中分配一個長度爲size的連續空間。其參數是一個無符號整形數,返回值是一個指向所分配的連續存儲域的起始地址的指針。還有一點必須注重的是,當函數未能成功分配存儲空間(如內存不足)就會返回一個NULL指針。所以在調用該函數時應該檢測返回值是否爲NULL並執行相應的操作。


鏈表的C語言實現之動態內存分配
更多內容請看C/C++進階技術文檔專題,或

下例是一個動態分配的程序:

#include

#include

main()

{

int count,*array; /*count是一個計數器,array是一個整型指針,也可以理解爲指向一個整型數組的首地址*/

if((array(int *) malloc(10*sizeof(int)))==NULL)

{

PRintf("不能成功分配存儲空間。");

exit(1);

}

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語言實現之動態內存分配
更多內容請看C/C++進階技術文檔專題,或

一、爲什麽用動態內存分配   但我們未學習鏈表的時候,假如要存儲數量比較多的同類型或同結構的數據的時候,總是使用一個數組。比如說我們要存儲一個班級學生的某科分數,總是定義一個float型(存在0.5分)數組: float score[30];   但是,在使用數組的時候,總有一個問題困擾著我們:數組應該有多大?  在很多的情況下,你並不能確定要使用多大的數組,比如上例,你可能並不知道該班級的學生的人數,那麽你就要把數組定義得足夠大。這樣,你的程序在運行時就申請了固定大小的你認爲足夠大的內存空間。即使你知道該班級的學生數,但是假如因爲某種非凡原因人數有增加或者減少,你又必須重新去修改程序,擴大數組的存儲範圍。這種分配固定大小的內存分配方法稱之爲靜態內存分配。但是這種內存分配的方法存在比較嚴重的缺陷,非凡是處理某些問題時:在大多數情況下會浪費大量的內存空間,在少數情況下,當你定義的數組不夠大時,可能引起下標越界錯誤,甚至導致嚴重後果。   那麽有沒有其它的方法來解決這樣的外呢體呢?有,那就是動態內存分配。   所謂動態內存分配就是指在程序執行的過程中動態地分配或者回收存儲空間的分配內存的方法。動態內存分配不象數組等靜態內存分配方法那樣需要預先分配存儲空間,而是由系統根據程序的需要即時分配,且分配的大小就是程序要求的大小。從以上動、靜態內存分配比較可以知道動態內存分配相對于景泰內存分配的特點:   1、不需要預先分配存儲空間;   2、分配的空間可以根據程序的需要擴大或縮小。 二、如何實現動態內存分配及其治理   要實現根據程序的需要動態分配存儲空間,就必須用到以下幾個函數   1、malloc函數   malloc函數的原型爲: void *malloc (unsigned int size)   其作用是在內存的動態存儲區中分配一個長度爲size的連續空間。其參數是一個無符號整形數,返回值是一個指向所分配的連續存儲域的起始地址的指針。還有一點必須注重的是,當函數未能成功分配存儲空間(如內存不足)就會返回一個NULL指針。所以在調用該函數時應該檢測返回值是否爲NULL並執行相應的操作。 [url=/bbs/detail_1785338.html][img]http://image.wangchao.net.cn/it/1323423839709.gif[/img][/url] 更多內容請看C/C++進階技術文檔專題,或   下例是一個動態分配的程序: #include #include main() {  int count,*array; /*count是一個計數器,array是一個整型指針,也可以理解爲指向一個整型數組的首地址*/  if((array(int *) malloc(10*sizeof(int)))==NULL)  {   PRintf("不能成功分配存儲空間。");   exit(1);  }  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函數是釋放已經不用的內存區域的。   所以由這兩個函數就可以實現對內存區域進行動態分配並進行簡單的治理了。 [url=/bbs/detail_1785338.html][img]http://image.wangchao.net.cn/it/1323423839760.gif[/img][/url] 更多內容請看C/C++進階技術文檔專題,或
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有