資料介紹
?一:C語言程序的存儲區(qū)域
??由C語言代碼(文本文件)形成可執(zhí)行程序(二進制文件),需要經(jīng)過編譯-匯編-連接三個階段。編譯過程把C語言文本文件生成匯編程序,匯編過程把匯編程序形成二進制機器代碼,連接過程則將各個源文件生成的二進制機器代碼文件組合成一個文件。
??C語言編寫的程序經(jīng)過編譯-連接后,將形成一個統(tǒng)一文件,它由幾個部分組成。在程序運行時又會產生其他幾個部分,各個部分代表了不同的存儲區(qū)域:
??1、代碼段(Code或Text)
??代碼段由程序中執(zhí)行的機器代碼組成。在C語言中,程序語句進行編譯后,形成機器代碼。在執(zhí)行程序的過程中,CPU的程序計數(shù)器指向代碼段的每一條機器代碼,并由處理器依次運行。
??2、只讀數(shù)據(jù)段(RO data)
??只讀數(shù)據(jù)段是程序使用的一些不會被更改的數(shù)據(jù),使用這些數(shù)據(jù)的方式類似查表式的操作,由于這些變量不需要更改,因此只需要放置在只讀存儲器中即可。
??3、已初始化讀寫數(shù)據(jù)段(RW data)
??已初始化數(shù)據(jù)是在程序中聲明,并且具有初值的變量,這些變量需要占用存儲器的空間,在程序執(zhí)行時它們需要位于可讀寫的內存區(qū)域內,并具有初值,以供程序運行時讀寫。
??4、未初始化數(shù)據(jù)段(BSS)
??未初始化數(shù)據(jù)是在程序中聲明,但是沒有初始化的變量,這些變量在程序運行之前不需要占用存儲器的空間。
??5、堆(heap)
??堆內存只在程序運行時出現(xiàn),一般由程序員分配和釋放。在具有操作系統(tǒng)的情況下,如果程序沒有釋放,操作系統(tǒng)可能在程序(例如一個進程)結束后回收內存。
??6、棧(stack)
??棧內存只在程序運行時出現(xiàn),在函數(shù)內部使用的變量、函數(shù)的參數(shù)以及返回值將使用??臻g,??臻g由編譯器自動分配和釋放。
??C語言目標文件的內存布局
??看一個例子:
??int a = 0; //全局初始化區(qū),。data段
??static int b=20; //全局初始化區(qū),。data段
??char *p1; //全局未初始化區(qū) .bss段
??const int A = 10; //.rodata段
??void main(void)
??{
??int b; //棧
??char s[] = "abc"; //棧
??char *p2; //棧
??static int c = 0; //全局(靜態(tài))初始化區(qū) .data段
??char *p3 = "123456"; //123456\0在常量區(qū),p3 在棧上。
??p1 = (char*) malloc(10);//分配得來的10和20個字節(jié)的區(qū)域就在堆區(qū)
??p2 = (char*) malloc(20);
??strcpy(p1, "123456"); //123456\0 在常量區(qū),編譯器可能會將它與p3所指向的"123456"優(yōu)化成一個地方
??}
??代碼段、只讀數(shù)據(jù)段、讀寫數(shù)據(jù)段、未初始化數(shù)據(jù)段屬于靜態(tài)區(qū)域,而堆和棧屬于動態(tài)區(qū)域。代碼段、只讀數(shù)據(jù)段和讀寫數(shù)據(jù)段將在鏈接之后產生,未初始化數(shù)據(jù)段將在程序初始化的時候開辟,而堆和棧將在程序的運行中分配和釋放。C語言程序分為映像和運行時兩種狀態(tài)。在編譯-連接后形成的映像中,將只包含代碼段(Text)、只讀數(shù)據(jù)段(RO Data)和讀寫數(shù)據(jù)段(RW Data)。在程序運行之前,將動態(tài)生成未初始化數(shù)據(jù)段(BSS),在程序的運行時還將動態(tài)形成堆(Heap)區(qū)域和棧(Stack)區(qū)域。一般來說,在靜態(tài)的映像文件中,各個部分稱之為節(jié)(Section),而在運行時的各個部分稱之為段(Segment)。如果不詳細區(qū)分,可以統(tǒng)稱為段。
??知識點:
??C語言在編譯和連接后,將生成代碼段(Text)、只讀數(shù)據(jù)段(RO Data)和讀寫數(shù)據(jù)段(RW Data)。在運行時,除了以上三個區(qū)域外,還包括未初始化數(shù)據(jù)段(BSS)區(qū)域和堆(Heap)區(qū)域和棧(Stack)區(qū)域。
??二:C語言程序的段
??1、代碼段(code或text)
??代碼段由各個函數(shù)產生,函數(shù)的每一個語句將最終經(jīng)過編繹和匯編生成二進制機器代碼(具體生生哪種體系結構的機器代碼由編譯器決定)。
??2、只讀數(shù)據(jù)段(RO Data)
??只讀數(shù)據(jù)段由程序中所使用的數(shù)據(jù)產生,該部分數(shù)據(jù)的特點是在運行中不需要改變,因此編譯器會將該數(shù)據(jù)段放入只讀的部分中。C語言中的只讀全局變量,只讀局部變量,程序中使用的常量等會在編譯時被放入到只讀數(shù)據(jù)區(qū)。
??注意:定義全局變量const char a[100]={"ABCDEFG"};將生成大小為100個字節(jié)的只讀數(shù)據(jù)區(qū),并使用“ABCDEFG”初始化。如果定義為:const char a[ ]={"ABCDEFG"};則根據(jù)字符串長度生成8個字節(jié)的只讀數(shù)據(jù)段(還有’\0’),所以在只讀數(shù)據(jù)段中,一般都需要做完全的初始化。
??3、讀寫數(shù)據(jù)段(RW Data)
??讀寫數(shù)據(jù)段表示了在目標文件中一部分可以讀也可以寫的數(shù)據(jù)區(qū),在某些場合它們又被稱為已初始化數(shù)據(jù)段,這部分數(shù)據(jù)段和代碼段,與只讀數(shù)據(jù)段一樣都屬于程序中的靜態(tài)區(qū)域,但具有可寫性的特點。通常已初始化的全局變量和局部靜態(tài)變量被放在了讀寫數(shù)據(jù)段,如: 在函數(shù)中定義static char b[ 100]={“ABCDEFG”};讀寫數(shù)據(jù)區(qū)的特點是必須在程序經(jīng)過初始化,如果只定義,沒初始值,則不會生成讀寫數(shù)據(jù)區(qū),而會定位為未初始化數(shù)據(jù)區(qū)(BSS)。如果全局變量(函數(shù)外部定義的變量)加入static修飾,這表示只能在文件內使用,而不能被其他文件使用。
??4、未初始化數(shù)據(jù)段(BSS)
??與讀寫數(shù)據(jù)段類似,它也屬于靜態(tài)數(shù)據(jù)區(qū),但是該段中的數(shù)據(jù)沒有經(jīng)過初始化。因此它只會在目標文件中被標識,而不會真正稱為目標文件中的一段,該段將會在運行時產生。未初始化數(shù)據(jù)段只在運行的初始化階段才會產生,因此它的大小不會影響目標文件的大小。
??在C語言的程序中,對變量的使用還有以下幾點需要注意:
??1、函數(shù)體中定義的變量通常是在棧上,不需要在程序中進行管理,由編繹器處理。
??2、用malloc,calloc,realloc等分配內存的函數(shù)所分配的內存空間在堆上,程序必須保證在使用free釋放,否則會發(fā)生內存泄漏。
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 關于嵌入式程序員的重要問題資料下載
- 六個單片機C語言基礎編程源碼,了解一下,隨時用得上資料下載
- 電路保護器件的重要問題資料下載
- 初學C語言,你的“行囊”需要準備什么呢?資料下載
- 使用單片機實現(xiàn)62256擴展內存的C語言程序免費下載 12次下載
- 使用C語言進行IOT物聯(lián)網(wǎng)編程的程序免費下載 10次下載
- 指北針的C語言程序資料免費下載 12次下載
- 紅外線的應用C語言程序資料免費下載 9次下載
- C語言入門教程之18個C語言入門經(jīng)典的程序資料免費下載 60次下載
- LED drv應用的詳細C語言程序資料免費下載 3次下載
- mychar 實驗C語言程序資料免費下載 0次下載
- LED實驗C語言程序資料免費下載 3次下載
- LED燈中斷C語言程序資料免費下載 8次下載
- 基于微電子器件應用中的幾個重要問題 21次下載
- 微電子器件應用中的幾個重要問題
- C語言中的socket編程基礎 2k次閱讀
- 技術干貨驛站 ▏深入理解C語言:掌握程序結構知識 2.3k次閱讀
- PLC編程語言和C語言的區(qū)別 6.6k次閱讀
- plc編程語言與c語言的聯(lián)系 c語言和PLC有什么區(qū)別 7k次閱讀
- 淺聊Rust程序內存布局 1.3k次閱讀
- C語言大佬評價C語言從熟練到精通的幾個層級劃分 看你屬于哪個擋位 4.3k次閱讀
- C語言內存問題如何解決 987次閱讀
- 干貨 | 嵌入式C語言的內存管理 5.6k次閱讀
- 如何寫好一個效率高效思路清晰的C語言程序教你關鍵的三招 5.9k次閱讀
- C語言程序內存布局該關注哪些內容 1.2k次閱讀
- 學習開發(fā)環(huán)境和編程語言:匯編語言和C語言的比較 9.7k次閱讀
- C語言作為高級編程語言中的一門“低級”語言為什么要學習? 8.9k次閱讀
- Java編程和c語言哪一種更有優(yōu)勢_C語言與JAVA的區(qū)別是什么 2.5w次閱讀
- arduino用什么語言編程 7.1w次閱讀
- 單片機編程之匯編語言基礎-常用指令和程序模式 1.6w次閱讀
下載排行
本周
- 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 專業(yè)版下載 (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次下載 | 免費
電子發(fā)燒友App





創(chuàng)作
發(fā)文章
發(fā)帖
提問
發(fā)資料
發(fā)視頻
上傳資料賺積分
評論