談談記憶體分配與動態記憶體分配

2021-10-04 22:55:36 字數 1363 閱讀 6701

記憶體分配

程式在記憶體中是分段儲存的。

**段:存放語句轉換的二進位制**;程式執行時不可修改;

全域性段(靜態儲存區):用來記錄全域性變數和靜態變數的儲存位置;不會隨著程式的執行而改變;

棧:由編譯器自動分配釋放,存放區域性變數,塊變數,形式引數和返回值的儲存位置;隨著程式的執行其大小將不斷改變;函式呼叫時,開闢空間,函式呼叫結束收回其空間;不同呼叫函式之間遵循後進先出的原則。

堆:存放動態分布的儲存位置;一般由程式設計師分配釋放,通過呼叫free函式釋放記憶體,若不釋放,程式可能由os作業系統**。

bss段:存放未初始化的全域性變數一塊記憶體區域,bss段屬於靜態記憶體分配。

一.傳統陣列(靜態陣列)的缺點

1.陣列的長度必須事先指定,並且是常整數;不能是變數int a[5];

2.傳統陣列記憶體無法由程式設計師釋放,只能由系統釋放。(並且只能在陣列所在函式結束後才能釋放)。

3.陣列的長度在函式執行期間不能動態的擴充和縮小

4.a函式定義的傳統陣列,在a函式結束後,在b函式中是不能使用的,因為已經釋放。也就是傳統陣列不能跨越函式。

區分:靜態儲存與記憶體的靜態開闢

二.為什麼要動態分配記憶體

用來解決傳統陣列的四個缺陷

舉個例子,用靜態陣列來儲存乙個班級學生,大概60人,暫且定義陣列長度為60,班級同學留級,則人數較少,陣列長度不能改變,這時大量分配的記憶體位址變造成了浪費。若班級新來同學,,又會出現記憶體分配不足的情況,通常把這種情況叫做溢位。

這時動態記憶體分配便可以解決這個問題。

動態記憶體分配用多少,使用多少。根據你使用的的資料大小來分配記憶體。

有如下優點:

1.不會造成記憶體浪費

2.能夠隨時增加,減少

三.動態記憶體分配舉例

方法:通過malloc 函式,在堆開闢空間

1.malloc 是由程式設計師在堆疊動態開闢空間

2.返回值開闢空間的首位址,但是型別是void *,需要強制型別轉換

3.*分配的記憶體空間應該能整除型別所佔的位元組數

4.包含標頭檔案malloc.h

5.只能用free(p)來釋放p所指的動態開闢的記憶體空間

6.堆動態記憶體空間的操作,用 *p來操作。

#include

#include

intmain

(argc ,

char

*argc)

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

靜態開闢的記憶體:在棧中開闢,由編譯器分配,由系統自動釋放

動態分配的記憶體:在堆中開闢,由程式設計師開闢,由程式設計師自動釋放。

動態記憶體分配

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

動態記憶體分配

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

動態記憶體分配

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