動態記憶體分配 重點

2021-10-05 09:37:05 字數 2278 閱讀 2702

動態記憶體分配【重點難點】

傳統陣列的缺點:

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

例子:int a[5]; //ok int len = 5; int a[len]; //error

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

在乙個函式執行期間,系統為該函式中陣列所分配的空間會一直存在,直到該函式執行完畢時,陣列的空間才會被系統釋放

3、陣列的長度一旦定義,其長度就不能再改變 陣列的長度不能在函式執行的過程中動態的擴充或縮小

4、a函式定義的陣列在a函式執行期間可以被其他函式使用,但a函式執行完畢之後,a函式中的陣列將無法再被其他函式使用

傳統方式定義的陣列不能跨函式使用

為什麼需要動態分配記憶體?

動態陣列很好地解決了傳統陣列這四個缺點
傳統陣列也叫靜態陣列

動態記憶體分配舉例——動態陣列的構造【難點】

malloc 函式的使用(兩個程式講解)

/* 

date: 20/04/22 16:42

description: 該程式沒有實際含義

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

*/# include

# include

int main (

void

)

/*

date: 20/04/22 17:17

description: malloc 的用法

*/# include

# include

voidf(

int*q)

// q 是 p 的乙份拷貝

voidg(

int*

* p)

int main (

void)/*

在devc++中輸出的結果是

---------------------------------

10200

&p = 300

--------------------------------

*/

構造動態一維陣列(乙個程式講解)

/* 

date: 20/04/22 17:45

description: 動態一維陣列

*/# include

# include

int main (

void

)

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

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

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

動態記憶體是由程式設計師手動分配,手動釋放(不釋放會造成記憶體洩漏)

動態記憶體是在堆分配的

【棧和堆的概念具體可參見資料結構】

跨函式使用記憶體的問題【難點】

預備知識:多級指標的使用【詳見指標的用法】

靜態變數不能跨函式使用詳解【重點】 (乙個程式講解)

/*

date: 20/04/23 13:03

description: 靜態變數不能跨函式使用 靜態記憶體是在棧裡分配的,出棧之後就不能使用了

該程式並沒有實際含義

*/# include

voidf(

int*

*q)// q也是個指標變數,無論q是什麼型別的指標變數,都只佔4個位元組

int main (

void

)

動態變數可以跨函式使用詳解【重點】 (乙個程式講解)

/*

date: 20/04/23 18:47

description: 動態記憶體是在堆裡分配的,出棧不出棧沒有影響

*/# include

# include

voidf(

int*

*q )

int main (

void

)

動態記憶體分配

在c 中建立乙個物件時,我們必須要為這個物件申請一塊記憶體,而且要用建構函式對這塊記憶體進行初始化。c 中的new和delete相對於c的庫函式malloc和free在這方面有很大的優勢,所以我們主要講的是運算子new和delete。當用new來建立乙個物件時,它會自動在堆裡為物件分配記憶體並且為這...

動態記憶體分配

為什麼使用動態記憶體分配?c語言中的一切操作都是基於記憶體的 變數和陣列都是記憶體的別名,如何分配這些記憶體由編譯器在編譯期間決定 定義陣列的時候必須指定陣列唱的 而陣列長度是在編譯期就必須決定的 需求 程式執行的過程中,可能需要使用一些額外的記憶體空間 malloc和free malloc和fre...

動態記憶體分配

c的儲存類別有4種 自動的 auto 靜態的 statics 暫存器的 register 外部的 extern 全域性變數時分配在記憶體中的靜態儲存區 靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元,是在編譯時賦初值的,只賦初值一次,在程式執行時它已有初值,以後每次呼叫函式時不再重新賦初...