C語言學習 6 記憶體分配

2021-06-21 15:13:49 字數 2005 閱讀 1046

一、傳統陣列的缺點:

1、陣列的長度必須事先定製,且只能是常整數,不能是變數

intlen = 5; 

inta[len];  

//error

2、傳統形式定義的陣列,該程式的記憶體程式設計師無法手動釋放

# include 

void

f(void

);  

//這二十個位元組的儲存空間程式設計師無法手動程式設計釋放它

//只能在本函式執行完畢時由系統自動釋放

}  int

main(

void

)  

3、陣列的長度不能在函式執行的過程中動態的擴充或縮小

4、a函式定義的陣列,在a函式執行期間可以被其他函式使用,但a函式執行完畢後,a函式中的陣列將無法被其他函式使用,靜態陣列不能跨函式使用。

# include 

void

g(int

*parr, 

intlen)  

void

f(void

);  

//f執行期間g();函式可以使用

g(a, 5);                    //當f執行完畢陣列a空間被釋放

printf("%d\n"

, a[2]);  

}  int

main(

void

)  

二、動態分配

為什麼要動態分配?動態分配陣列可以很好的解決上面四個問題。

舉例:動態陣列

/*2023年2月5日15:00:25

malloc 是 memory(記憶體) allocate(分配)的縮寫

*/# include 

# include //標頭檔案

intmain(

void

)  

# include 

# include 

void

f(int

* q)  

intmain(

void

)  

/*2023年2月5日15:37:36

動態一維陣列示例

*/# include 

# include 

intmain(

void

)  輸出結果:  

請輸入你要存放的元素個數:5  

1 2 3 4 5  

一維陣列的內容是:  

1  2  

3  4  

5  

三、靜態記憶體和動態記憶體的比較

靜態記憶體是由系統自動分配,由系統自動釋放

靜態記憶體是在棧中分配的

動態記憶體是由程式設計師手動分配,手動釋放

動態記憶體是在堆中分配的

# include 

void

f(int

** q)  

intmain(

void

)  

# include 

# include 

void

f(int

**q)  

intmain(

void

)  

C語言學習(六) 記憶體分配

1.儲存器 常用的儲存器型別如下 2.記憶體分配 參考鏈結 2.1 記憶體分配機制 1 棧 stack 位於函式內的區域性變數 包括函式實參 由編譯器負責分配釋放,函式結束,棧變數失效。2 堆 heap 由程式設計師用malloc calloc realloc分配,free釋放。如果程式設計師忘記f...

C語言學習筆記 動態記憶體分配

記憶體分割槽 說明 程式 區 code area 存放函式體的二進位制 靜態資料區 data area 也稱全域性資料區,包含的資料型別比較多,如全域性變數 靜態變數 一般常量 字串常量。其中 注意 靜態資料區的內存在程式結束後由作業系統釋放。堆區 heap area 一般由程式設計師分配和釋放,若...

C語言學習筆記(五) 記憶體分配

void getmemory char p,int num void test1 輸出內容 xmgcc void test11 char getmemory2 void test2 函式返回位址都是不安全的,因為函式結束後,函式變數的記憶體都會變釋放,因此這個位址其他運用程式也可以用到,會被修改。解...