**段(text):
儲存著程式的二進位制指令和常量資料,該區的許可權為唯讀,這部分區域的大小在程式執行前就已經確定,所以強行修改它會產生錯誤
靜態資料段(bss):
儲存沒初始化過的全域性變數和靜態變數,程式每次執行前都會將該區域清零。
資料段(data):
存放初始化過的全域性變數和靜態變數
棧:
存放著區域性變數和塊變數。該區域是由系統管理開闢和釋放,隨著函式的呼叫分配記憶體,同時該區域大小有限,超出棧記憶體會產生棧溢位或者段錯誤的警告。
堆:
堆和棧是相反的概念。堆是由程式設計師自己申請自己管理和釋放的記憶體,堆的大小理論上是計算機物理記憶體的極限。雖然很大,但是操作不當會讓系統奔潰。所以相對於堆,棧更安全。
隨著程式結構變得複雜,計算機硬體的更新換代,棧的大小滿足不了許多專案對記憶體的需求,又因為堆記憶體很大,又受我們的控制,所以堆記憶體開始擔大旗。
堆記憶體的申請:
函式原型: void *malloc(size_t,size);
功能:從堆記憶體中申請大小為size的記憶體,但是申請的記憶體中儲存什麼內容不確定。
返回值:成功返回申請到的記憶體的首位址,失敗則返回null
int
*arr=
malloc
(sizeof
(int
)*size)
;
size 是你想申請的空間大小,size為5,就申請5個大小為4位元組的連續的記憶體空間,在vs中因為**審查更嚴格所以要強轉成int*型別的返回值
釋放堆記憶體:
free
(arr)
;arr=
null
;
申請多塊堆記憶體:void *calloc(size_t nmemb, size_t size);
功能:從堆記憶體中申請nmemb塊size個位元組的記憶體,申請的記憶體塊會被初始化為0。
注意:申請的依然是一塊連續的記憶體。
arr=
calloc(5
,10);
調整堆記憶體:void *realloc(void *ptr, size_t size);
功能:改變已經有記憶體塊的大小,在原有的基礎上調大或調小。
返回值:是調整後的記憶體塊的首位址,一定要重新接收返回值,可能不是在原內塊上調整的。
如果無法在原記憶體塊上進行調整:
1、申請一塊新的符合要的記憶體塊
2、把原記憶體塊上的內容拷貝過去
3、把原記憶體釋放掉返回新記憶體塊的首位址
arr=
realloc
(arr,30)
;
C 棧 堆記憶體
由編譯器自動分配釋放 存放函式引數值,區域性變數值等。其操作方式類似於資料結構中棧。一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中堆是兩回事,分配方式倒是類似於鍊錶,呵呵。全域性變數和靜態變數儲存是放在一塊,初始化全域性變數和靜態變數在一塊區域,未初始化全域性...
C 堆記憶體和棧記憶體詳解
堆 順序隨意 棧 先進後出 堆和棧的區別 一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧 2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不...
C 堆記憶體和棧記憶體詳解
堆 順序隨意 棧 先進後出 堆和棧的區別 一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧 2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不...