動態記憶體分配

2021-06-22 23:34:48 字數 2074 閱讀 9676

堆區,棧區,常量區,全域性區,靜態區,**區(編譯後的二進位製碼)

//解決方案

:讓空間在函式執行完畢之後

,系統不會收即可

,定義成全域性變數或者靜態變數

,或者再堆區開闢空間

./** * 

儲存區的劃分

:    (1)棧區:

棧區儲存區域性變數

,棧區的記憶體是由系統自動管理

,系統開闢

,系統**

,無需程式設計師管理

.    

(2)堆區:

通過堆區記憶體分配函式

,分配的空間都在堆區

,堆區的最大特點

:堆區的空間需要程式設計師手動管理

,手動開闢

,手動釋放

.(oc

常用)    

(3)常量區:

對於字元常量

,整形常量

,浮點型常量

,字串常量統一儲存在該區

,該區的記憶體由系統自動管理,特點

:常量區的內容不可修改

.    

(4)靜態區,

全域性區:

儲存全域性變數以及靜態變數

.記憶體由系統管理

,但是在程式的執行期間空間都不會釋放

.    

(5)**區:

編譯之後形成的

cpu指令儲存在該區

.    概念

: 區域性變數

:在函式內部定義的變數,陣列

.(棧區

)       

全域性變數

:在函式外部定義的變數,陣列

.(全域性區

)       

靜態變數:由

static

修飾的變數

.(靜態區

) */ //

堆區記憶體分配函式

//malloc,

需要指定需要開闢的空間大小 //

返回在堆區開闢的空間的位址

//void *

是乙個泛型

,可以代表所有的指標型別 //

比如: char *, int *, float *, student *,

char

*p =

malloc(8

);//

確定開闢的空間要儲存的資料

//    

p = "android"; //

常量區變數不可更改.

strcpy

(p,"android"

);   

printf

("%s\n"

, p +

4);    

*(p +

4) =

'b';   

printf

("%s\n"

, p +

3);   

free

(p);

//釋放堆區記憶體

,刪除只是標記刪除

,不會刪除內容

//free(p);

//1.

野指標錯誤 //

產生原因

:訪問不該訪問

(已經沒有使用權

,空間已經釋放

,還給系統

)的記憶體.

//解決方案

:釋放記憶體的所有權的同時將位址也清除掉.

p =

null;//

指向無效的區域

//2.

過度釋放 //

產生原因

:對一塊記憶體釋放

(free)多次.

//解決方案

:保證只釋放

(free)一次,

將其他的釋放操作刪掉

.(會立即

carsh)

//3.

記憶體洩露 //

產生原因

:分配了記憶體使用完以後

,沒有釋放掉

,造成記憶體堆積

,最後會因為沒有記憶體可分配

,而造成程式

crash //

解決方案

:使用玩記憶體後

,要將記憶體立即釋放掉

.

動態記憶體分配

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

動態記憶體分配

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

動態記憶體分配

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