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