動態記憶體分配【重點難點】
傳統陣列的缺點:
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 全域性變數時分配在記憶體中的靜態儲存區 靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元,是在編譯時賦初值的,只賦初值一次,在程式執行時它已有初值,以後每次呼叫函式時不再重新賦初...