下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、教您布局c語言編程程序的內(nèi)存教您布局編程程序的內(nèi)存重點關(guān)注以下內(nèi)容:c語言程序在內(nèi)存中各個段的組成c語言程序銜接過程中的特性和常見錯誤c語言程序的運行方式一:c語言程序的存儲區(qū)域由c語言代碼(文本文件)形成可執(zhí)行程序(二進(jìn)制文件),需要經(jīng)過編譯-匯編-銜接三個階段。編譯過程把c語言文本文件生成匯編程序,匯編過程把匯編程序形成二進(jìn)制機器代碼,銜接過程則將各個源文件生成的二進(jìn)制機器代碼文件組合成一個文件。c語言編寫的程序經(jīng)過編譯-銜接后,將形成一個統(tǒng)一文件,它由幾個部分組成。在程序運行時又會產(chǎn)生其他幾個部分,各個部分代表了不同的存儲區(qū)域:1.代碼段(code或text)代碼段由程序中執(zhí)行的機器代碼
2、組成。在c語言中,程序語句舉行編譯后,形成機器代碼。在執(zhí)行程序的過程中,cpu的程序計數(shù)器指向代碼段的每一條機器代碼,并由處理器依次運行。2.只讀數(shù)據(jù)段(ro data)只讀數(shù)據(jù)段是程序用法的一些不會被更改的數(shù)據(jù),用法這些數(shù)據(jù)的方式類似查表式的操作,因為這些變量不需要更改,因此只需要放置在只讀存儲器中即可。3.已初始化讀寫數(shù)據(jù)段(rw data)已初始化數(shù)據(jù)是在程序中聲明,并且具有初值的變量,這些變量需要占用存儲器的空間,在程序執(zhí)行時它們需要位于可讀寫的內(nèi)存區(qū)域內(nèi),并具有初值,以供程序運行時讀寫。4.未初始化數(shù)據(jù)段(bss)未初始化數(shù)據(jù)是在程序中聲明,但是沒有初始化的變量,這些變量在程序運行之
3、前不需要占用存儲器的空間。5.堆(heap)堆內(nèi)存只在程序運行時浮現(xiàn),普通由程序員分配和釋放。在具有操作系統(tǒng)的狀況下,假如程序沒有釋放,操作系統(tǒng)可能在程序(例如一個進(jìn)程)結(jié)束后回收內(nèi)存。6.棧(stack)棧內(nèi)存只在程序運行時浮現(xiàn),在函數(shù)內(nèi)部用法的變量、函數(shù)的參數(shù)以及返回值將用法??臻g,??臻g由編譯器自動分配和釋放。c語言目標(biāo)文件的內(nèi)存布局看一個例子:int a = 0; /全局初始化區(qū),。data段static int b=20; /全局初始化區(qū),。data段char *p1; /全局未初始化區(qū) .bss段const int a = 10; /.rodata段void main(void)i
4、nt b; /棧char s = "abc" /棧char *p2; /棧static int c = 0; /全局(靜態(tài))初始化區(qū) .data段char *p3 = "123456" /1234560在常量區(qū),p3 在棧上。p1 = (char*) malloc(10);/分配得來的10和20個字節(jié)的區(qū)域就在堆區(qū)p2 = (char*) malloc(20);strcpy(p1, "123456"); /1234560 在常量區(qū),編譯器可能會將它與p3所指向的"123456"優(yōu)化成一個地方代碼段、只讀數(shù)據(jù)段、讀寫
5、數(shù)據(jù)段、未初始化數(shù)據(jù)段屬于靜態(tài)區(qū)域,而堆和棧屬于動態(tài)區(qū)域。代碼段、只讀數(shù)據(jù)段和讀寫數(shù)據(jù)段將在鏈接之后產(chǎn)生,未初始化數(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)稱為段。學(xué)
6、問點:c語言在編譯和銜接后,將生成代碼段(text)、只讀數(shù)據(jù)段(ro data)和讀寫數(shù)據(jù)段(rw data)。在運行時,除了以上三個區(qū)域外,還包括未初始化數(shù)據(jù)段(bss)區(qū)域和堆(heap)區(qū)域和棧(stack)區(qū)域。二:c語言程序的段1.代碼段(code或text)代碼段由各個函數(shù)產(chǎn)生,函數(shù)的每一個語句將終于經(jīng)過編繹和匯編生成二進(jìn)制機器代碼(詳細(xì)生生哪種體系結(jié)構(gòu)的機器代碼由編譯器打算)。2.只讀數(shù)據(jù)段(ro data)只讀數(shù)據(jù)段由程序中所用法的數(shù)據(jù)產(chǎn)生,該部分?jǐn)?shù)據(jù)的特點是在運行中不需要轉(zhuǎn)變,因此編譯器會將該數(shù)據(jù)段放入只讀的部分中。c語言中的只讀全局變量,只讀局部變量,程序中用法的常量等會
7、在編譯時被放入到只讀數(shù)據(jù)區(qū)。注重:定義全局變量const char a100="abcdefg"將生成大小為100個字節(jié)的只讀數(shù)據(jù)區(qū),并用法“abcdefg”初始化。假如定義為:const char a ="abcdefg"則按照字符串長度生成8個字節(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ū)域,但具有可寫性的特點。通常已初始化的全局變量和局部
8、靜態(tài)變量被放在了讀寫數(shù)據(jù)段,如: 在函數(shù)中定義static char b 100=“abcdefg”;讀寫數(shù)據(jù)區(qū)的特點是必需在程序經(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)文件中的一段,該段將會在運行時產(chǎn)生。未初始化數(shù)據(jù)段只在運行的初始化階段才會產(chǎn)生,因此它的大小不會影響目標(biāo)文件的大小。在c語言的程
9、序中,對變量的用法還有以下幾點需要注重:1.函數(shù)體中定義的變量通常是在棧上,不需要在程序中舉行管理,由編繹器處理。2.用malloc,calloc,realloc等分配內(nèi)存的函數(shù)所分配的內(nèi)存空間在堆上,程序必需保證在用法free釋放,否則會發(fā)生內(nèi)存泄漏。3.全部函數(shù)體外定義的是全局變量,加了static后的變量不管是在函數(shù)內(nèi)部或外部都放在全局區(qū)。4.用法const定義的變量將放于程序的只讀數(shù)據(jù)區(qū)。三:程序中段的用法下面用一個容易的例子來解釋c語言中變量和段的對應(yīng)關(guān)系。c語言程序中的全局區(qū)(靜態(tài)區(qū)),實際對應(yīng)著下述幾個段:ro data; rw data ; bss data.普通來說,挺直定義
10、的全局變量在未初始化數(shù)據(jù)區(qū),假如該變量有初始化則是在已初始化數(shù)據(jù)區(qū)(rw data),加上const則將放在只讀數(shù)據(jù)區(qū)。const char ro = "this is read only data" /只讀數(shù)據(jù)區(qū)static char rw_1 ="this is global read write data" /已初始化讀寫數(shù)據(jù)段char bss_1 100; /未初始化數(shù)據(jù)段const char *ptrconst ="constant data" /字符串放在只讀取數(shù)據(jù)段int main()short b; /在棧上,占用2個
11、字節(jié)char a100; /在棧上開拓100個字節(jié), 它的值是其首地址char s ="abcdefg" /s在棧上,占用4個字節(jié),"abcdefg"本身放置在只讀數(shù)據(jù)存儲區(qū),占8個字節(jié)char *p1; /p1在棧上,占用4個字節(jié)char *p2="123456" /p2 在棧上,p2指向的內(nèi)容不能改,“123456”在只讀數(shù)據(jù)區(qū)static char rw_2 ="this is local read write data"/局部已初始化讀寫數(shù)據(jù)段static char bss_2100; /局部未初始化數(shù)據(jù)段
12、static int c = 0; /全局(靜態(tài))初始化區(qū)p1=(char *)malloc(10 * sizeof(char ) ); /分配內(nèi)存區(qū)域在堆區(qū)strcpy(p1,"xxxx"); /“xxxx”放在只讀數(shù)據(jù)區(qū),占5個字節(jié)free(p1); /用法free釋放p1所指向的內(nèi)存return 0;讀寫數(shù)據(jù)段包含了憶初始化的全局變量 static char rw_1 以及局部靜態(tài)變量static rw_2 .其差別在于編繹時,是在函數(shù)內(nèi)部用法的還是可以在囫圇文件中用法。對于rw_1 無論有無static 修飾,其都將被放置在讀寫數(shù)據(jù)區(qū),只是能否被其它文件引用與否。對于后者就不一樣了,它是局部靜態(tài)變量,放置在讀寫數(shù)據(jù)區(qū),假如沒static修飾,其意義徹低轉(zhuǎn)變,它將會是開拓在??臻g的局部變量,而不是靜態(tài)變量,在這里rw_1,rw_2后沒詳細(xì)數(shù)值,表示靜態(tài)區(qū)大小同后面字符串長度打算。對于未初始化數(shù)據(jù)區(qū)bss_1100與bss_2100,其區(qū)分在于前者是全局變量,在全部文件中都可以用法;后者是局部變量,只在函數(shù)內(nèi)部用法。未初始化數(shù)據(jù)段不設(shè)置后面的初
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版智能庫房備貨與倉儲物流合同3篇
- 二零二五年度抵賬合同范本:風(fēng)險控制策略3篇
- 2025年度協(xié)議離婚原因探討及財產(chǎn)分割與子女撫養(yǎng)責(zé)任協(xié)議3篇
- 二零二五年度智慧農(nóng)業(yè)項目建設(shè)、運營與移交協(xié)議2篇
- 二零二五年專業(yè)家政服務(wù)人員安全責(zé)任合同范本3篇
- 二零二五年度接送機服務(wù)與企業(yè)團建合同
- 檢測與傳感課程設(shè)計
- 二零二五年度地質(zhì)災(zāi)害風(fēng)險評估與勘察設(shè)計服務(wù)合同2篇
- 2025年度版權(quán)買賣合同:知名歌手專輯的版權(quán)購買與發(fā)行3篇
- 飼草料加工機械安全操作規(guī)程(2篇)
- 2023智能座艙白皮書-聚焦電動化下半場-畢馬威
- 福建省福州市九師教學(xué)聯(lián)盟2023-2024學(xué)年高一上學(xué)期期末學(xué)業(yè)聯(lián)考化學(xué)試題(解析版)
- 植物病蟲害防治技能大賽理論題及答案
- 2024-2025學(xué)年六年級科學(xué)上冊第二單元《地球的運動》測試卷(教科版)
- 福建省廈門市2023-2024學(xué)年高二上學(xué)期期末考試語文試題(原卷版)
- 生態(tài)河道治理工程施工組織設(shè)計
- 2024年基本級執(zhí)法資格考試題庫及解析(100題)
- 教育培訓(xùn)內(nèi)部管理體制
- 2024年阿拉善中小學(xué)教師招聘真題
- 2021教科版五年級科學(xué)上冊全冊教案
- 100以內(nèi)兩位數(shù)進(jìn)位加法退位減法計算題-(直接打印版)
評論
0/150
提交評論