從記憶體理解c語言中變數的儲存型別

2021-07-15 11:48:21 字數 2871 閱讀 5806

今晚看了一下linux程式設計,看到了程序管理這一塊,講解了c語言中的各種變數的儲存型別,而且是從程序、記憶體的角度講解的,以前從沒有這樣理解過,覺得挺有用的,在這裡記錄下來。

首先要來理解一下可執行檔案載入進記憶體後形成的程序在記憶體中的結構,如下圖:

**區:存放cpu執行的機器指令,**區是可共享,並且是唯讀的。

資料區:存放已初始化的全域性變數、靜態變數(全域性和區域性)、常量資料。

bbs區:存放的是未初始化的全域性變數和靜態變數。

棧區:由編譯器自動分配釋放,存放函式的引數值、返回值和區域性變數,在程式執行過程中實時分配和釋放,棧區由作業系統自動管理,無須程式設計師手動管理。

堆區:堆是由malloc()函式分配的記憶體塊,使用free()函式來釋放記憶體,堆的申請釋放工作由程式設計師控制,容易產生記憶體洩漏。

c語言中的儲存型別有auto, extern, register, static 這四種,儲存型別說明了該變數要在程序的哪乙個段中分配記憶體空間,可以為變數分配記憶體儲存空間的有資料區、bbs區、棧區、堆區。下面來一一舉例看一下這幾個儲存型別:

1. auto儲存型別

auto只能用來標識區域性變數的儲存型別,對於區域性變數,auto是預設的儲存型別,不需要顯示的指定。因此,auto標識的變數儲存在棧區中。示例如下:

[cpp]view plain

copy

#include 

intmain(

void

)    

2. extern儲存型別

extern用來宣告在當前檔案中引用在當前專案中的其它檔案中定義的全域性變數。如果全域性變數未被初始化,那麼將被存在bbs區中,且在編譯時,自動將其值賦值為0,如果已經被初始化,那麼就被存在資料區中。全域性變數,不管是否被初始化,其生命週期都是整個程式執行過程中,為了節省記憶體空間,在當前檔案中使用extern來宣告其它檔案中定義的全域性變數時,就不會再為其分配記憶體空間。

示例如下:

[cpp]view plain

copy

#include 

inti=5; 

//定義全域性變數,並初始化

void

test(

void

)    

[cpp]view plain

copy

#include 

extern

i; //宣告引用全域性變數i

intmain(

void

)    

[plain]view plain

copy

$ gcc -o test test.c file.c  #編譯連線  

$ ./test  #執行  

[plain]view plain

copy

結果:  

in main i=5  

in subfunction i=5  

3. register儲存型別

宣告為register的變數在由記憶體調入到cpu暫存器後,則常駐在cpu的暫存器中,因此訪問register變數將在很大程度上提高效率,因為省去了變數由記憶體調入到暫存器過程中的好幾個指令週期。如下示例:

[cpp]view plain

copy

#include 

intmain(

void

)    

4. static儲存型別

被宣告為靜態型別的變數,無論是全域性的還是區域性的,都儲存在資料區中,其生命週期為整個程式,如果是靜態區域性變數,其作用域為一對{}內,如果是靜態全域性變數,其作用域為當前檔案。靜態變數如果沒有被初始化,則自動初始化為0。靜態變數只能夠初始化一次。示例如下:

[cpp]view plain

copy

#include 

intsum(

inta)  

intmain()    

[plain]view plain

copy

$ gcc -o test test.c  

$ ./test   

a=2,    c=1,    b=6 sum(a)=9  

a=2,    c=1,    b=7 sum(a)=10  

a=2,    c=1,    b=8 sum(a)=11  

a=2,    c=1,    b=9 sum(a)=12  

a=2,    c=1,    b=10    sum(a)=13  

6. 字串常量

字串常量儲存在資料區中,其生存期為整個程式執行時間,但作用域為當前檔案,示例如下:

[cpp]view plain

copy

#include 

char

*a="hello"

;  void

test()  

intmain()    

[plain]view plain

copy

$ gcc -o test test.c  

$ ./test   

yes,a==b  

yes,a==c  

no,a!=d  

總結如下表:

C語言中整型變數的記憶體儲存形式

本文介紹c語言中整型變數在記憶體中的儲存形式。主要分析二進位制和十六進製制的形式。示例 如下 include include include int main 上述 的執行結果如下 sizeof a is 4 sizeof int is 4 integer a 7 binary a 11111111...

C語言中變數儲存類別

c語言根據變數的生存週期來劃分,可以分為靜態儲存方式和動態儲存方式。靜態儲存方式 是指在程式執行期間分配固定的儲存空間的方式。靜態儲存區中存放了在整個程式執行過程中都存在的變數,如全域性變數。動態儲存方式 是指在程式執行期間根據需要進行動態的分配儲存空間的方式。動態儲存區中存放的變數是根據程式執行的...

C語言中資料的儲存記憶體

c中的資料在記憶體的儲存可以用儲存時期 作用域和鏈結來體現。儲存時期 儲存時期分為靜態的 自動的和分配的。靜態的變數一般用關鍵字static來標示 全域性變數不用static也是靜態的 它在程式開始執行的時候就為變數分配記憶體空間,在整個程式中一直存在。自動的用auto來標示 預設省略auto 變數...