c語言記憶體四區( )

2021-07-30 16:32:52 字數 1815 閱讀 3613

圖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、char buf[20] = "aaaa" 將常量區aaaa拷貝到棧區

2、buf2 = "bbbb"也是分配資料區(常量區)空間和buf是一樣的

3、指標p1指向的是常量區的字串,儲存該字串的位址

4、指標p2指向的是堆區的記憶體空間,字串從常量區拷貝到堆區

C語言記憶體四區

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

C語言記憶體四區

1 棧區 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。2 堆區 一般由程式設計師分配並釋放,若程式設計師不釋放,程式結束時可能由作業系統 3 資料區 主要包括靜態全域性區和常量區。4 區 存放函式體的二進位制 分清楚變數的記憶體處於哪個區對於程式設計至關重要。乙個典型的,卻比較晦澀的例...

C語言的記憶體四區

在執行乙個c語言程式時,此程式將擁有唯一的 記憶體四區 棧區 堆區 全域性區 區.一 棧區 由編譯器自動分配釋放,存放函式的形參 區域性變數等。當函式執行完畢時自動釋放。includechar getmem void main printf tmp s n tmp 輸出tmp system paus...