C語言之記憶體四區模型和函式呼叫模型

2021-08-03 20:31:41 字數 1481 閱讀 6575

圖1、記憶體四區模型

流程說明

1、作業系統把物理硬碟**load到記憶體

2、作業系統把c**分成四個區

3、作業系統找到main函式入口執行

乙個由c/c++編譯的程式占用的記憶體分為以下幾個部分

1、棧區(stack):由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方

式類似於資料結構中的棧。

2、堆區(heap: 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os回   收 。

注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶。

3、資料區:主要包括靜態全域性區和常量區,如果要站在彙編角度細分的話還可以分為很多小的區。

全域性區(靜態區)(static):全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變

量和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。 

程式結束後有系統釋放

常量區 :常量字串就是放在這裡的。 程式結束後由系統釋放

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

1、堆疊的生長方向和存放資料增長方向不一樣

圖2、堆疊的生長方向

變數三要素是:名稱、大小、作用域。那麼變數的生命週期是多長呢?

編譯器是如何管理每個函式間變數的生命週期呢?

要研究變數的生命週期,而變數一般又是在函式中定義分配空間的。

因此下面研究一下變數作為函式引數和返回值傳遞分析

下面我們具體總結一下,各個函式的變數的生命週期

main裡面的變數分配記憶體,函式fa(),函式fb()中的變數分配的記憶體空間它們的生命週期都是多長呢?

上述圖1,已經說明了記憶體主要分為四區,因此每個函式中變數在堆疊的生命週期是不同的,

同時在函式呼叫的時候,先執行的函式最後才執行完畢

總結:1、主調函式分配的記憶體空間(堆,棧,全域性區)可以在被呼叫函式中使用,可以以指標作函式引數的形式來使用

2、被呼叫函式分配的記憶體空間只有堆區和全域性區可以在主調函式中使用(返回值和函式引數),而棧區卻不行,因為棧區函式體執行完之後

這個函式占用的記憶體編譯器自動幫你釋放了。

3、一定要明白函式的主被調關係以及主被調函式記憶體分配**,也就是後面接下幾篇總結的函式的輸入輸出記憶體模型

C語言之記憶體四區模型和函式呼叫模型

流程說明 1 作業系統把物理硬碟 load到記憶體 2 作業系統把c 分成四個區 3 作業系統找到main函式入口執行 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方 式類似於資料結構中的棧。2 堆區 h...

C語言記憶體四區模型分析

圖1 1 記憶體四區模型是c語言學習的乙個重點也是乙個難點,大多程式設計師往往注重 的編寫而不注重 在執行中所進行的記憶體的變化而導致程式出現問題,嚴重時導致程式失控崩潰.圖1 1很直觀的表示記憶體當中儲存的資料型別,以及記憶體之間的關聯。1.c語言的記憶體區分 1.1 記憶體四區 1.1.1 區 ...

c語言記憶體四區( )

圖1 記憶體四區模型 流程說明 1 作業系統把物理硬碟 load到記憶體 2 作業系統把c 分成四個區 3 作業系統找到main函式入口執行 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方 式類似於資料結...