一、為什么用動態(tài)內(nèi)存分配
但我們未學習鏈表的時候,如果要存儲數(shù)量比較多的同類型或同結(jié)構(gòu)的數(shù)據(jù)的時候,總是使用一個數(shù)組。
比如說我們要存儲一個班級學生的某科分數(shù),總是定義一個float型(存在0.5分)數(shù)組:
float score[30];
但是,在使用數(shù)組的時候,總有一個問題困擾著我們:數(shù)組應(yīng)該有多大?
在很多的情況下,你并不能確定要使用多大的數(shù)組,比如上例,你可能并不知道該班級的學生的人數(shù),那么你就要把數(shù)組定義得足夠大。這樣,你的程序在運行時就申請了固定大小的你認為足夠大的內(nèi)存空間。即使你知道該班級的學生數(shù),但是如果因為某種特殊原因人數(shù)有增加或者減少,你又必須重新去修改程序,擴大數(shù)組的存儲范圍。這種分配固定大小的內(nèi)存分配方法稱之為靜態(tài)內(nèi)存分配。但是這種內(nèi)存分配的方法存在比較嚴重的缺陷,特別是處理某些問題時:在大多數(shù)情況下會浪費大量的內(nèi)存空間,在少數(shù)情況下,當你定義的數(shù)組不夠大時,可能引起下標越界錯誤,甚至導致嚴重后果。
那么有沒有其它的方法來解決這樣的外呢體呢?有,那就是動態(tài)內(nèi)存分配。
所謂動態(tài)內(nèi)存分配就是指在程序執(zhí)行的過程中動態(tài)地分配或者回收存儲空間的分配內(nèi)存的方法。動態(tài)內(nèi)存分配不象數(shù)組等靜態(tài)內(nèi)存分配方法那樣需要預(yù)先分配存儲空間,而是由系統(tǒng)根據(jù)程序的需要即時分配,且分配的大小就是程序要求的大小。從以上動、靜態(tài)內(nèi)存分配比較可以知道動態(tài)內(nèi)存分配相對于景泰內(nèi)存分配的特點:
1、不需要預(yù)先分配存儲空間;
2、分配的空間可以根據(jù)程序的需要擴大或縮小。
二、如何實現(xiàn)動態(tài)內(nèi)存分配及其管理
要實現(xiàn)根據(jù)程序的需要動態(tài)分配存儲空間,就必須用到以下幾個函數(shù)
1、malloc函數(shù)
malloc函數(shù)的原型為:
void *malloc (unsigned int size)
其作用是在內(nèi)存的動態(tài)存儲區(qū)中分配一個長度為size的連續(xù)空間。其參數(shù)是一個無符號整形數(shù),返回值是一個指向所分配的連續(xù)存儲域的起始地址的指針。還有一點必須注意的是,當函數(shù)未能成功分配存儲空間(如內(nèi)存不足)就會返回一個NULL指針。所以在調(diào)用該函數(shù)時應(yīng)該檢測返回值是否為NULL并執(zhí)行相應(yīng)的操作。
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |