資料介紹
?一:C語言程序的存儲區域
??由C語言代碼(文本文件)形成可執行程序(二進制文件),需要經過編譯-匯編-連接三個階段。編譯過程把C語言文本文件生成匯編程序,匯編過程把匯編程序形成二進制機器代碼,連接過程則將各個源文件生成的二進制機器代碼文件組合成一個文件。
??C語言編寫的程序經過編譯-連接后,將形成一個統一文件,它由幾個部分組成。在程序運行時又會產生其他幾個部分,各個部分代表了不同的存儲區域:
??1、代碼段(Code或Text)
??代碼段由程序中執行的機器代碼組成。在C語言中,程序語句進行編譯后,形成機器代碼。在執行程序的過程中,CPU的程序計數器指向代碼段的每一條機器代碼,并由處理器依次運行。
??2、只讀數據段(RO data)
??只讀數據段是程序使用的一些不會被更改的數據,使用這些數據的方式類似查表式的操作,由于這些變量不需要更改,因此只需要放置在只讀存儲器中即可。
??3、已初始化讀寫數據段(RW data)
??已初始化數據是在程序中聲明,并且具有初值的變量,這些變量需要占用存儲器的空間,在程序執行時它們需要位于可讀寫的內存區域內,并具有初值,以供程序運行時讀寫。
??4、未初始化數據段(BSS)
??未初始化數據是在程序中聲明,但是沒有初始化的變量,這些變量在程序運行之前不需要占用存儲器的空間。
??5、堆(heap)
??堆內存只在程序運行時出現,一般由程序員分配和釋放。在具有操作系統的情況下,如果程序沒有釋放,操作系統可能在程序(例如一個進程)結束后回收內存。
??6、棧(stack)
??棧內存只在程序運行時出現,在函數內部使用的變量、函數的參數以及返回值將使用棧空間,棧空間由編譯器自動分配和釋放。
??C語言目標文件的內存布局
??看一個例子:
??int a = 0; //全局初始化區,。data段
??static int b=20; //全局初始化區,。data段
??char *p1; //全局未初始化區 .bss段
??const int A = 10; //.rodata段
??void main(void)
??{
??int b; //棧
??char s[] = "abc"; //棧
??char *p2; //棧
??static int c = 0; //全局(靜態)初始化區 .data段
??char *p3 = "123456"; //123456\0在常量區,p3 在棧上。
??p1 = (char*) malloc(10);//分配得來的10和20個字節的區域就在堆區
??p2 = (char*) malloc(20);
??strcpy(p1, "123456"); //123456\0 在常量區,編譯器可能會將它與p3所指向的"123456"優化成一個地方
??}
??代碼段、只讀數據段、讀寫數據段、未初始化數據段屬于靜態區域,而堆和棧屬于動態區域。代碼段、只讀數據段和讀寫數據段將在鏈接之后產生,未初始化數據段將在程序初始化的時候開辟,而堆和棧將在程序的運行中分配和釋放。C語言程序分為映像和運行時兩種狀態。在編譯-連接后形成的映像中,將只包含代碼段(Text)、只讀數據段(RO Data)和讀寫數據段(RW Data)。在程序運行之前,將動態生成未初始化數據段(BSS),在程序的運行時還將動態形成堆(Heap)區域和棧(Stack)區域。一般來說,在靜態的映像文件中,各個部分稱之為節(Section),而在運行時的各個部分稱之為段(Segment)。如果不詳細區分,可以統稱為段。
??知識點:
??C語言在編譯和連接后,將生成代碼段(Text)、只讀數據段(RO Data)和讀寫數據段(RW Data)。在運行時,除了以上三個區域外,還包括未初始化數據段(BSS)區域和堆(Heap)區域和棧(Stack)區域。
??二:C語言程序的段
??1、代碼段(code或text)
??代碼段由各個函數產生,函數的每一個語句將最終經過編繹和匯編生成二進制機器代碼(具體生生哪種體系結構的機器代碼由編譯器決定)。
??2、只讀數據段(RO Data)
??只讀數據段由程序中所使用的數據產生,該部分數據的特點是在運行中不需要改變,因此編譯器會將該數據段放入只讀的部分中。C語言中的只讀全局變量,只讀局部變量,程序中使用的常量等會在編譯時被放入到只讀數據區。
??注意:定義全局變量const char a[100]={"ABCDEFG"};將生成大小為100個字節的只讀數據區,并使用“ABCDEFG”初始化。如果定義為:const char a[ ]={"ABCDEFG"};則根據字符串長度生成8個字節的只讀數據段(還有’\0’),所以在只讀數據段中,一般都需要做完全的初始化。
??3、讀寫數據段(RW Data)
??讀寫數據段表示了在目標文件中一部分可以讀也可以寫的數據區,在某些場合它們又被稱為已初始化數據段,這部分數據段和代碼段,與只讀數據段一樣都屬于程序中的靜態區域,但具有可寫性的特點。通常已初始化的全局變量和局部靜態變量被放在了讀寫數據段,如: 在函數中定義static char b[ 100]={“ABCDEFG”};讀寫數據區的特點是必須在程序經過初始化,如果只定義,沒初始值,則不會生成讀寫數據區,而會定位為未初始化數據區(BSS)。如果全局變量(函數外部定義的變量)加入static修飾,這表示只能在文件內使用,而不能被其他文件使用。
??4、未初始化數據段(BSS)
??與讀寫數據段類似,它也屬于靜態數據區,但是該段中的數據沒有經過初始化。因此它只會在目標文件中被標識,而不會真正稱為目標文件中的一段,該段將會在運行時產生。未初始化數據段只在運行的初始化階段才會產生,因此它的大小不會影響目標文件的大小。
??在C語言的程序中,對變量的使用還有以下幾點需要注意:
??1、函數體中定義的變量通常是在棧上,不需要在程序中進行管理,由編繹器處理。
??2、用malloc,calloc,realloc等分配內存的函數所分配的內存空間在堆上,程序必須保證在使用free釋放,否則會發生內存泄漏。
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 關于嵌入式程序員的重要問題資料下載
- 六個單片機C語言基礎編程源碼,了解一下,隨時用得上資料下載
- 電路保護器件的重要問題資料下載
- 初學C語言,你的“行囊”需要準備什么呢?資料下載
- 使用單片機實現62256擴展內存的C語言程序免費下載 12次下載
- 使用C語言進行IOT物聯網編程的程序免費下載 10次下載
- 指北針的C語言程序資料免費下載 12次下載
- 紅外線的應用C語言程序資料免費下載 9次下載
- C語言入門教程之18個C語言入門經典的程序資料免費下載 60次下載
- LED drv應用的詳細C語言程序資料免費下載 3次下載
- mychar 實驗C語言程序資料免費下載 0次下載
- LED實驗C語言程序資料免費下載 3次下載
- LED燈中斷C語言程序資料免費下載 8次下載
- 基于微電子器件應用中的幾個重要問題 21次下載
- 微電子器件應用中的幾個重要問題
- C語言中的socket編程基礎 397次閱讀
- 技術干貨驛站 ▏深入理解C語言:掌握程序結構知識 1484次閱讀
- PLC編程語言和C語言的區別 3090次閱讀
- plc編程語言與c語言的聯系 c語言和PLC有什么區別 4302次閱讀
- 淺聊Rust程序內存布局 682次閱讀
- C語言大佬評價C語言從熟練到精通的幾個層級劃分 看你屬于哪個擋位 2573次閱讀
- C語言內存問題如何解決 474次閱讀
- 干貨 | 嵌入式C語言的內存管理 4955次閱讀
- 如何寫好一個效率高效思路清晰的C語言程序教你關鍵的三招 5434次閱讀
- C語言程序內存布局該關注哪些內容 942次閱讀
- 學習開發環境和編程語言:匯編語言和C語言的比較 9082次閱讀
- C語言作為高級編程語言中的一門“低級”語言為什么要學習? 8181次閱讀
- Java編程和c語言哪一種更有優勢_C語言與JAVA的區別是什么 2.4w次閱讀
- arduino用什么語言編程 6.9w次閱讀
- 單片機編程之匯編語言基礎-常用指令和程序模式 1.5w次閱讀
下載排行
本周
- 1電子電路原理第七版PDF電子教材免費下載
- 0.00 MB | 1491次下載 | 免費
- 2單片機典型實例介紹
- 18.19 MB | 95次下載 | 1 積分
- 3S7-200PLC編程實例詳細資料
- 1.17 MB | 27次下載 | 1 積分
- 4筆記本電腦主板的元件識別和講解說明
- 4.28 MB | 18次下載 | 4 積分
- 5開關電源原理及各功能電路詳解
- 0.38 MB | 11次下載 | 免費
- 6100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 7基于單片機和 SG3525的程控開關電源設計
- 0.23 MB | 4次下載 | 免費
- 8基于AT89C2051/4051單片機編程器的實驗
- 0.11 MB | 4次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費
- 2PADS 9.0 2009最新版 -下載
- 0.00 MB | 66304次下載 | 免費
- 3protel99下載protel99軟件下載(中文版)
- 0.00 MB | 51209次下載 | 免費
- 4LabView 8.0 專業版下載 (3CD完整版)
- 0.00 MB | 51043次下載 | 免費
- 5555集成電路應用800例(新編版)
- 0.00 MB | 33562次下載 | 免費
- 6接口電路圖大全
- 未知 | 30320次下載 | 免費
- 7Multisim 10下載Multisim 10 中文版
- 0.00 MB | 28588次下載 | 免費
- 8開關電源設計實例指南
- 未知 | 21539次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935053次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537793次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191183次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183277次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138039次下載 | 免費
評論