歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C語言程序的存儲區域與const關鍵字的使用方法

C語言程序的存儲區域與const關鍵字的使用方法

日期:2017/3/1 10:25:14   编辑:Linux編程

一.C語言程序的存儲區域

1.由C語言代碼(文本文件)形成可執行程序(二進制文件),需要經過編譯-匯編-連接三個階段。編譯過程把C語言文本文件生成匯編程序,匯編過程把匯編程序形成二進制機器代碼,連接過程則將各個源文件生成的二進制機器代碼文件組合成一個文件。

2.C語言編寫的程序經過編譯-連接後,將形成一個統一文件,它由幾個部分組成。在程序運行時又會產生其他幾個部分,各個部分代表了不同的存儲區域:

1>代碼段(Code或Text)

代碼段由程序中執行的機器代碼組成。在C語言中,程序語句執行編譯後,形成機器代碼。在執行程序的過程中,CPU的程序計數器指向代碼段的每一條機器代碼,並由處理器依次運行。

2>只讀數據段(RO data)

只讀數據段是程序使用的一些不會被更改的數據,使用這些數據的方式類似查表式的操作,由於這些變量不需要更改,因此只需要放置在只讀存儲器中即可。

3>已初始化讀寫數據段(RW data)

已初始化數據是在程序中聲明,並且具有初值的變量,這些變量需要占用存儲器的空間,在程序執行時它們需要位於可讀寫的內存區域內,並且有初值,以供程序運行時讀寫。
4>未初始化數據段(BBS)

未初始化數據是在程序中聲明,但是沒有初始化的變量,這些變量在程序運行之前不需要占用存儲器的空間。

5>堆(heap)

堆內存只在程序運行時出現,一般由程序員分配和釋放。在具有操作系統的情況下,如果程序沒有釋放,操作系統可能在程序(例如一個進程)結束後會後內存。

6>棧(statck)

堆內存只在程序運行時出現,在函數內部使用的變量,函數的參數以及返回值將使用棧空間,棧空間由編譯器自動分配和釋放。


3.代碼段、只讀數據段、讀寫數據段、未初始化數據段屬於靜態區域,而堆和棧屬於動區域。代碼段、只讀數據段和讀寫數據段將在連接之後產生,未初始化數據段將在程序初始化的時候開辟,而對堆和棧將在程序餓運行中分配和釋放。

4.C語言程序分為映像和運行時兩種狀態。在編譯-連接後形成的映像中,將只包含代碼段(Text)、只讀數據段(R0 Data)和讀寫數據段(RW Data)。在程序運行之前,將動態生成未初始化數據段(BSS),在程序的運行時還將動態生成堆(Heap)區域和棧(Stack)區域。

注:1.一般來說,在靜態的映像文件中,各個部分稱之為節(Section),而在運行時的各個部分稱之為段(Segment)。如果不詳細區分,統稱為段。

2.C語言在編譯連接後,將生成代碼段(TEXT),只讀數據段(RO Data)和讀寫數據段(RW Data)。在運行時,除了上述三個區域外,還包括未初始化數據段(BBS)區域和堆(heap)區域和棧(Stack)區域。

Copyright © Linux教程網 All Rights Reserved