C語言中的記憶體模型(棧區,堆區等的分別)

2021-10-01 15:39:39 字數 1354 閱讀 1105

眾所周知**是儲存在記憶體中的,那麼c語言的**是全部儲存在一起的還是分開儲存的呢,它們儲存的地方到底在哪呢?

今天我們就來一**竟。

上圖就是c語言**的具體儲存位置,接下來我將一一介紹。

**區:存放函式體的二進位制**。

常量區:存放一般的常量、字串常量等。這塊記憶體只有讀取許可權,沒有寫入許可權,因此它們的值在程式執行期間不能改變。(這點尤其重要,一定要牢記)

靜態區(全域性區):存放全域性變數、靜態變數等。這塊記憶體有讀寫許可權,因此它們的值在程式執行期間可以任意改變。(這裡有個小細節值得我們注意一下,所有的全域性變數在未初始化時都會預設被賦值為0,而當我們定義全域性變數時,已初始化的變數和未初始化的變數實際上是分別儲存在不同位置的,系統會將儲存在未初始化的變數區的變數統一賦值為0後,再與已初始化的變數放在一起存放。)

堆區:一般由程式設計師分配和釋放,若程式設計師不釋放,程式執行結束時由作業系統**。malloc()、calloc()、free() 等函式操作的就是這塊記憶體。

棧區:存放函式的引數值、區域性變數的值等。

接下來我給出一段**,請大家判斷**中的各部分都是儲存在**的。

#include

char

*str1 =

"hello world"

;int n;

char

*func()

intmain()

答案:

#include

char

*str1 =

"hello world"

;//字串在常量區,str1在全域性資料區

int n;

//全域性資料區

char

*func()

intmain()

這裡值得我們留意一下:

char

*str2 =

"01234"

;//字串在常量區,str2在棧區

char arr[20]

="56789"

;//字串在常量區和棧區,arr在棧區

實際上「01234」和「56789」都是儲存在常量區的,而第一種實際上是用指標指向了常量區中存放「01234」的位置上,所以你是不可以使用這樣的語句的:*str2=『6』的(因為你試圖改變常量區中的東西);而第二種則是在棧區開闢了乙個新的儲存空間,然後將常量區的「56789」複製乙份放在棧區中,因此你是可以使用這樣的語句的:arr[0]=『0』,但是這樣做並不會改變常量區中的「56789」。

C語言中堆區棧區的區別

平常我們在程式設計 的過程中,經常使用的是c語言,在編寫 的過程中,會有這樣的思考 你的 中資料是怎麼存放的?存放在哪些地方,怎麼來在stm32或者其他硬體平台上來運轉?在c語言編寫 的過程中,記憶體分為四區 棧區 堆區 全域性變數區 區 1 棧區 由編譯器自動分配釋放,存放函式的引數,區域性變數的...

記憶體的使用 棧區 堆區 靜態區 唯讀區

記憶體的使用感覺好亂啊,需要整理一下!於是參考c primer與網上資源,整理如下 一 綜述 記憶體中的棧區分配的是區域性變數和函式的引數值的空間,棧的生長方向是從高往低的 堆區是向上增長的用於分配程式設計師申請的記憶體空間 比如new 申請的動態記憶體 注意它與資料結構中的堆是兩回事,分配方式倒是...

C 中的棧區,堆區,常量區

include void main 對應的彙編 10 a c 1 00401067 8a 4d f1 mov cl,byte ptr ebp 0fh 0040106a 88 4d fc mov byte ptr ebp 4 cl 11 a p 1 0040106d 8b 55 ec mov edx,...