堆區,棧區,常量區,全域性區,靜態區,**區(編譯後的二進位製碼)
//解決方案
:讓空間在函式執行完畢之後
,系統不會收即可
,定義成全域性變數或者靜態變數
,或者再堆區開闢空間
./** *
儲存區的劃分
: (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 全域性變數時分配在記憶體中的靜態儲存區 靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元,是在編譯時賦初值的,只賦初值一次,在程式執行時它已有初值,以後每次呼叫函式時不再重新賦初...