C 語言的內存分區

C/C++ 將內存劃分爲四個區
這裏寫圖片描述

1、棧區(stacksegment)—自動分配區,由編譯器來維護,申請的方式是棧指針減四(一條指令通常爲四個字節),而釋放的方式是將棧指針加四。

現假設過程P調用過程Q,並且假設P是主函數,則P的棧區保存:本身的局部變量、Q所用到的參數值、以及調用指令的後一條指令的地址(即返回地址)。而Q的棧區則保存調用Q之前的幀指針的值(地址,用來P的返回)、本身的局部變量、寄存器中的值(因爲可能會覆蓋P執行過程中某些寄存器的值,所以要先保存下來)、以及Q調用其他過程使用的參數。

爲什麼叫棧?因爲函數的調用有“先調用的後返回、後調用先返回”的特點,因此內存空間也有“先申請的後釋放,後釋放的先申請”的特點,和數據結構棧一樣,因此被稱爲棧內存。

2、堆區(heapsegment)—動態分配區,一般由程序員分配與釋放,在C語言中使用 malloc/free 函數操作堆內存。堆區內存和數據結構堆沒有一點關係。忘記釋放會導致“內存泄漏“,消耗大量內存以至於操作系統可能崩潰,而過早釋放則指針會隨機指向別的地方,而那塊內存可能保存了某些數據。

3、靜態區(datasegment)—靜態存儲區,存放靜態變量(全局變量以及靜態局部變量)和常量,內存在程序編譯時一次分配並初始化,程序執行完後釋放。靜態指的是值所佔據的內存位置、大小不變,而不是值不變。

4、代碼區(codesegment)—存放程序的二進制代碼(機器碼)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章