二、記憶體被耗盡
三、野指標
四、應用經驗
五、課後作業
在c語言中,編寫程式的時候不能確定記憶體的大小,希望程式在執行的過程中根據資料量的大小動態的分配記憶體。動態記憶體管理,就是指在程式執行過程中動態的申請和釋放記憶體空間。
c語言允許程式動態管理記憶體,需要時隨時開闢,不需要時隨時釋放。記憶體的動態管理是通過呼叫庫函式來實現的,主要有malloc和free函式。
函式的原型:
void
*malloc
(unsigned
int size);
malloc的作用是向系統申請一塊大小為size的連續記憶體空間,如果申請失敗,函式返回0,如果申請成功,返回成功分配記憶體塊的起始位址。
例如:
malloc
(100
); // 申請 100 個位元組的臨時分配域,返回值為其第乙個位元組的位址
malloc的返回值的位址的基型別為void,即不指向任何型別的資料,只提供乙個位址,程式中需要定義乙個指標來指向動態分配的記憶體位址。
例如:
int
*pi=
malloc
(sizeof
(int))
;
函式的原型:
void
free
(void
*p);
free的作用是釋放指標p指向的動態記憶體空間,p是呼叫malloc函式時返回的位址,free函式無返回值。
例如:
free
(pi)
;// 釋放指標變數pi指向的已分配的動態空間
示例(book107.c)
/*
* 程式名:book107.c,此程式用於演示c程式動態記憶體管理。
*/#include
#include
#include
struct st_girl // 超女結構體
;int
main
(int argc,
char
*ar**)
執行效果
使用動態分配記憶體技術的時候,分配出來的記憶體必須及時釋放,否則會引起系統記憶體耗盡,這話說起來簡單,好像很容易做到,但是在實際開發中,程式設計師往往是漏洞百出。
記憶體問題是c程式設計師的主要問題之一,是初學者的惡夢。
野指標就是無效的指標,與空指標不同,野指標無法通過簡單地判斷是否為 null避免,而只能通過養成良好的程式設計習慣來盡力減少。
指標變數剛被建立時不一定會自動初始化成為空指標(與編譯器有關),它的預設值是可能隨機的,它會隨便亂指。所以,指標變數在建立的同時應當被初始化,要麼將指標的值設定為0,要麼讓它指向合法的記憶體。
int
*pi=
0;
或
int i;
int*pi=
&i;
指標在free時會把指標所指的記憶體給釋放掉,但指標不一定會賦值0(也與編譯器有關),如果對釋放後的指標進行操作,相當於非法操作記憶體。釋放記憶體後應立即將指標置為0。
free
(pi)
;pi=
0;
在c語言的早期標準中,定義陣列必須用常量指明大小,不能用變數。
char str[
101]
;// 可以這樣
int len=
101;
char str[len]
;// 不可以這樣
程式在執行的時候,如果要定義乙個字串存放100個字元,那怎麼辦,只能通過動態分配記憶體技術。
char
*str=
malloc
(101
);
現在,定義陣列可以用變數指明大小,就不必為陣列動態分配記憶體了。
還有,c++的string是乙個變長的字串,非常好用,程式設計師根本不必關心記憶體的問題。
鍊錶是c語言的乙個經典的資料結構,相當於乙個動態的結構體陣列,非常巧妙,功能強大,但操作也麻煩,在這裡我就不介紹了。
在c++中,容器全完代替了鍊錶的功能,極其好用,程式設計師也不必關心記憶體的問題。
在中國,沒有純c程式設計師,如果他不會c++,不是他對c有多麼執著,可能是不會c++。
至少十年了,我不再使用動態記憶體分配技術,也想不到有什麼場景非得用動態記憶體分配技術。
哦,嵌入式開發可能是個例外,可能還有其它只能用c不能用c++的場景。
動態記憶體分配並不是什麼高大上的技術,我是乙個實用的程式設計師,絕不給自己挖坑,這與水平高低無關。
編寫示例程式,把本章節介紹的知識點全部演示一遍,用程式演示可以加深您的理解和映象。
C語言動態記憶體管理
1 概述 動態儲存管理的基本問題是 系統如何按請求分配記憶體,如何 記憶體再利用。提出請求的使用者可能是系統的乙個作業,也可能是程式中的乙個變數。空閒塊 未曾分配的位址連續的記憶體區稱為 空閒塊 占用塊 已分配給使用者使用的位址連續的記憶體區稱為 占用塊 系統剛剛啟動時,整個記憶體可看做乙個大的 空...
C語言動態記憶體管理
c系統的函式庫中提供了了程式動態申請和釋放記憶體儲存塊的庫函式,下面將分別介紹。1 malloc 函式 a 該函式的原型 void malloc size t size b 該函式只有乙個引數,且形參size是無符號整型,該引數代表申請空間的位元組數。c 返回值 如果記憶體池中的可用記憶體滿足需求,...
C語言動態記憶體管理
在說明c語言記憶體管理之前,要知道什麼是記憶體,記憶體我個人認為可以理解為帶有標籤的盒子,所謂的帶標籤的盒子就像我們住的寢室一樣有門牌號,盒子內只能儲存固定型別的資料或變數,就如男生寢室只能住男生一樣。那麼c語言中有多少種盒子呢?有靜態儲存區 動態儲存區 內部暫存器區域。我們通常定義的變數如果沒有特...