国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

鏈表的C語言實(shí)現(xiàn)之動(dòng)態(tài)內(nèi)存分配

2019-11-17 05:03:24
字體:
供稿:網(wǎng)友
一、為什么用動(dòng)態(tài)內(nèi)存分配

  但我們未學(xué)習(xí)鏈表的時(shí)候,假如要存儲數(shù)量比較多的同類型或同結(jié)構(gòu)的數(shù)據(jù)的時(shí)候,總是使用一個(gè)數(shù)組。比如說我們要存儲一個(gè)班級學(xué)生的某科分?jǐn)?shù),總是定義一個(gè)float型(存在0.5分)數(shù)組:
float score[30];
  但是,在使用數(shù)組的時(shí)候,總有一個(gè)問題困擾著我們:數(shù)組應(yīng)該有多大?  在很多的情況下,你并不能確定要使用多大的數(shù)組,比如上例,你可能并不知道該班級的學(xué)生的人數(shù),那么你就要把數(shù)組定義得足夠大。這樣,你的程序在運(yùn)行時(shí)就申請了固定大小的你認(rèn)為足夠大的內(nèi)存空間。即使你知道該班級的學(xué)生數(shù),但是假如因?yàn)槟撤N非凡原因人數(shù)有增加或者減少,你又必須重新去修改程序,擴(kuò)大數(shù)組的存儲范圍。這種分配固定大小的內(nèi)存分配方法稱之為靜態(tài)內(nèi)存分配。但是這種內(nèi)存分配的方法存在比較嚴(yán)重的缺陷,非凡是處理某些問題時(shí):在大多數(shù)情況下會浪費(fèi)大量的內(nèi)存空間,在少數(shù)情況下,當(dāng)你定義的數(shù)組不夠大時(shí),可能引起下標(biāo)越界錯(cuò)誤,甚至導(dǎo)致嚴(yán)重后果。

  那么有沒有其它的方法來解決這樣的外呢體呢?有,那就是動(dòng)態(tài)內(nèi)存分配。

  所謂動(dòng)態(tài)內(nèi)存分配就是指在程序執(zhí)行的過程中動(dòng)態(tài)地分配或者回收存儲空間的分配內(nèi)存的方法。動(dòng)態(tài)內(nèi)存分配不象數(shù)組等靜態(tài)內(nèi)存分配方法那樣需要預(yù)先分配存儲空間,而是由系統(tǒng)根據(jù)程序的需要即時(shí)分配,且分配的大小就是程序要求的大小。從以上動(dòng)、靜態(tài)內(nèi)存分配比較可以知道動(dòng)態(tài)內(nèi)存分配相對于景泰內(nèi)存分配的特點(diǎn):

  1、不需要預(yù)先分配存儲空間;

  2、分配的空間可以根據(jù)程序的需要擴(kuò)大或縮小。

二、如何實(shí)現(xiàn)動(dòng)態(tài)內(nèi)存分配及其治理

  要實(shí)現(xiàn)根據(jù)程序的需要?jiǎng)討B(tài)分配存儲空間,就必須用到以下幾個(gè)函數(shù)

  1、malloc函數(shù)

  malloc函數(shù)的原型為:
void *malloc (unsigned int size)
  其作用是在內(nèi)存的動(dòng)態(tài)存儲區(qū)中分配一個(gè)長度為size的連續(xù)空間。其參數(shù)是一個(gè)無符號整形數(shù),返回值是一個(gè)指向所分配的連續(xù)存儲域的起始地址的指針。還有一點(diǎn)必須注重的是,當(dāng)函數(shù)未能成功分配存儲空間(如內(nèi)存不足)就會返回一個(gè)NULL指針。所以在調(diào)用該函數(shù)時(shí)應(yīng)該檢測返回值是否為NULL并執(zhí)行相應(yīng)的操作。

更多文章 更多內(nèi)容請看C/C++進(jìn)階技術(shù)文檔專題,或
  下例是一個(gè)動(dòng)態(tài)分配的程序:
#include
#include
main()
{
 int count,*array; /*count是一個(gè)計(jì)數(shù)器,array是一個(gè)整型指針,也可以理解為指向一個(gè)整型數(shù)組的首地址*/
 if((array(int *) malloc(10*sizeof(int)))==NULL)
 {
    exit(1);
 }
 for (count=0;count〈10;count++) /*給數(shù)組賦值*/
  array[count]=count;
 for(count=0;count〈10;count++) /*打印數(shù)組元素*/
  printf("%2d",array[count]);
}
  上例中動(dòng)態(tài)分配了10個(gè)整型存儲區(qū)域,然后進(jìn)行賦值并打印。例中if((array(int *) malloc(10*sizeof(int)))==NULL)語句可以分為以下幾步:

  1)分配10個(gè)整型的連續(xù)存儲空間,并返回一個(gè)指向其起始地址的整型指針

  2)把此整型指針地址賦給array

  3)檢測返回值是否為NULL

  2、free函數(shù)

  由于內(nèi)存區(qū)域總是有限的,不能不限制地分配下去,而且一個(gè)程序要盡量節(jié)省資源,所以當(dāng)所分配的內(nèi)存區(qū)域不用時(shí),就要釋放它,以便其它的變量或者程序使用。這時(shí)我們就要用到free函數(shù)。

  其函數(shù)原型是:
void free(void *p)
  作用是釋放指針p所指向的內(nèi)存區(qū)。

  其參數(shù)p必須是先前調(diào)用malloc函數(shù)或calloc函數(shù)(另一個(gè)動(dòng)態(tài)分配存儲區(qū)域的函數(shù))時(shí)返回的指針。給free函數(shù)傳遞其它的值很可能造成死機(jī)或其它災(zāi)難性的后果。


  注重:這里重要的是指針的值,而不是用來申請動(dòng)態(tài)內(nèi)存的指針本身。例:
int *p1,*p2;
p1=malloc(10*sizeof(int));
p2=p1;
……
free(p2) /*或者free(p2)*/
  malloc返回值賦給p1,又把p1的值賦給p2,所以此時(shí)p1,p2都可作為free函數(shù)的參數(shù)。

  malloc函數(shù)是對存儲區(qū)域進(jìn)行分配的。

  free函數(shù)是釋放已經(jīng)不用的內(nèi)存區(qū)域的。

  所以由這兩個(gè)函數(shù)就可以實(shí)現(xiàn)對內(nèi)存區(qū)域進(jìn)行動(dòng)態(tài)分配并進(jìn)行簡單的治理了。
更多文章 更多內(nèi)容請看C/C++進(jìn)階技術(shù)文檔專題,或

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 合肥市| 景宁| 博客| 那坡县| 永和县| 三门县| 河源市| 永修县| 泰来县| 中宁县| 抚州市| 沙湾县| 渭南市| 逊克县| 广东省| 师宗县| 金乡县| 太原市| 乌拉特前旗| 桑日县| 天峻县| 正镶白旗| 福安市| 盐源县| 白山市| 天津市| 双峰县| 健康| 姜堰市| 新丰县| 博客| 英吉沙县| 江阴市| 涟水县| 五华县| 来宾市| 丰台区| 汝阳县| 清河县| 南平市| 黑水县|