所謂動態記憶體分配(dynamic memory allocation)就是指在程式執行的過程中動態地分配或者**儲存空間的分配記憶體的方法。動態記憶體分配不象陣列等靜態記憶體分配方法那樣需要預先分配儲存空間,而是由系統根據程式的需要即時分配,且分配的大小就是程式要求的大小。凡是在程式中用到系統提供的動態分配儲存空間函,均要求包含標頭檔案。
malloc 向系統申請分配size位元組的儲存區。返回分配記憶體空間的起始位址,若分配失敗,則返回0,型別是 void* (或chaar*)、malloc(size)、unsigned size型別。void* 表示未確定型別的指標,void *可以指向任何型別的資料,更明確的說是指申請記憶體空間時還不知道使用者是用這段空間來儲存什麼型別的資料(比如是char還是int或者...)。c,c++規定,void* 型別可以強制轉換為任何其它型別的指標。
1、為什麼需要動態分配記憶體
首先介紹一下傳統陣列的缺點,這裡的傳統陣列也叫靜態陣列,傳統陣列的缺點:
1>.陣列長度必須事先定製,切只能是長整形,不能是變數;
2>.傳統形式定義的陣列,該陣列的記憶體程式設計師無法手動釋放;
3>.陣列的長度一旦定義,其長度無法更改;
4>.傳統形式定義陣列不能跨函式使用。
以上傳統陣列的四點缺陷,動態陣列能夠很好的解決這四個缺陷,所以我們需要動態分配記憶體。
2、malloc的使用:
malloc是memory(記憶體) allocate(分配)的縮寫
#include
#include//使用動態分配空間函式,必須新增malloc.h標頭檔案
int main(void)
3、動態記憶體分配舉例
#include
#include
int main(void)
4、動態陣列的構造
5、free(p)的使用
表示把p所指向的記憶體釋放掉,p本身的記憶體是靜態的,不能有程式設計師釋放掉,p本身的記憶體只能在p變數所在的函式執行終止後有系統釋放。
6、靜態、動態記憶體分配比較
1). 靜態記憶體分配是在編譯時完成的,不需要占用cpu資源;動態分配記憶體是在執行時完成的,動態記憶體的分配與釋放需要占用cpu資源;
2) .靜態記憶體分配是在棧上分配的,動態記憶體是堆上分配的;
3) .動態記憶體分配需要指標或引用資料型別的支援,而靜態記憶體分配不需要;
4) .靜態分配記憶體需要在編譯前確定記憶體塊的大小,而動態分配記憶體不需要編譯前確定記憶體大小,根據執行時環境確定需要的記憶體塊大小,按照需要分配記憶體即可。可以這麼說,靜態記憶體分配是按計畫分配,而動態記憶體分配是按需分配。
5) .靜態分配記憶體是把記憶體的控制權交給了編譯器,而動態記憶體是把記憶體的控制權交給了程式設計師;
綜上所述,靜態分配記憶體適合於編譯時就已經可以確定需要占用記憶體多少的情況,而在編譯時不能確定記憶體需求量時可使用動態分配記憶體;但靜態分配記憶體的執行效率要比動態分配記憶體的效率要高,因為動態記憶體分配與釋放需要額外的開銷;動態記憶體管理水平嚴重依賴於程式設計師的水平,如果處理不當容易造成記憶體洩漏。
7、如何選擇記憶體分配方式
1>. 全域性變數盡可能不要動態分配記憶體。
2>. 動態分配記憶體時,分配與釋放的**要對稱。
3>. 對動態建立的物件或分配的記憶體塊一定要檢查期有效性。
4>. 盡可能少次數地使用動態記憶體分配。
5>. 在保證資源利用率的前提下,能用靜態記憶體分配不用動態分配,特別是區域性臨時物件。
總結:靜態記憶體是有系統自動分配的,由系統自動釋放,靜態記憶體是在棧分配的;動態記憶體是由程式設計師分配的,手動釋放,動態記憶體是在堆分配的。
8、跨函式使用記憶體的問題
1>.靜態變數不能跨函式使用記憶體
/* 此**是錯誤的,目的是為了演示靜態變數不能跨函式使用靜態記憶體由系統分配,當函式執行完畢由系統自動釋放 */
# include
# include
void f(int ** q)
int main (void )
2>.動態記憶體可以跨函式使用記憶體
/* 動態記憶體由程式設計師手動分配,手動釋放 */
#include
#include
#include
void f(int ** q) //q存放int *型別變數的位址
int main(void)
// 動態記憶體由程式設計師手動分配,手動釋放
#include
#include
#include
void f(int ** q) //q存放int *型別變數的位址
int main(void)
記憶體空間 malloc函式
我好弱。我的知識還很匱乏。2020年1月7日 18 37 26 記憶體分配之malloc 函式。是在程式執行的時候進行記憶體分配的。此函式接收乙個引數 是所需的記憶體的位元組數。malloc 函式分配記憶體,不會給我們乙個類似於變數名的東西讓我們去訪問malloc 函式為我們申請的記憶體空間,而是為...
分配記憶體空間
void calloc size t nobj,size t size 分配足夠的記憶體給nobj個大小為size的物件組成的陣列,並返回指向所分配區域的第乙個位元組的指標 若記憶體不夠,則返回null.該空間的初始化大小為0位元組.char p char calloc 100,sizeof cha...
C 記憶體空間
乙個c 程式編譯後占用的記憶體分為如下幾個部分 棧 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值。在乙個程序中,位於使用者虛擬位址空間頂部的是使用者棧,編譯器用它來實現函式的呼叫。堆 由程式設計師分配和釋放,若程式設計師不釋放,則程式結束時被os 存放由new,malloc分配的記憶體,可...