關(guān)鍵字static的使用方法
粉絲提問
粉絲問題,總結(jié)一下:關(guān)鍵字static的使用方法。
問題
要想搞清楚關(guān)鍵字static的使用方法,必須首先搞清楚,可執(zhí)行程序段的分類以及各段在內(nèi)存區(qū)的邏輯地址的映射。
本文配套視頻,請(qǐng)見次條文章《【視頻講解】C語言static關(guān)鍵詞》
一、可執(zhí)行程序內(nèi)存分配
1. 可執(zhí)行程序程序分段
一個(gè)程序的3個(gè)基本段:text段,data段,bss段
BSSBSS(Block Started by Symbol)通常是指用來存放程序中未初始化的全局變量和靜態(tài)變量的一塊內(nèi)存區(qū)域。
特點(diǎn)是:可讀寫的,在程序執(zhí)行之前BSS段會(huì)自動(dòng)清0。
所以,未初始的全局變量在程序執(zhí)行之前已經(jīng)成0了。
注意和數(shù)據(jù)段的區(qū)別,BSS存放的是未初始化的全局變量和靜態(tài)變量,數(shù)據(jù)段存放的是初始化后的全局變量和靜態(tài)變量。
UNIX下可使用size命令查看可執(zhí)行文件的段大小信息。如size a.out。
數(shù)據(jù)段.data存放在編譯階段(而非運(yùn)行時(shí))就能確定的數(shù)據(jù),可讀可寫。
也就是通常所說的靜態(tài)存儲(chǔ)區(qū),賦了初值的全局變量和賦初值的靜態(tài)變量存放在這個(gè)區(qū)域,常量也存在這個(gè)區(qū)域。數(shù)據(jù)段,代碼段在程序運(yùn)行之前就已經(jīng)確定了的。
代碼段.text代碼段通常是指用來存放程序執(zhí)行代碼的一塊內(nèi)存區(qū)域。
這部分區(qū)域的大小在程序運(yùn)行前就已經(jīng)確定,并且內(nèi)存區(qū)域通常屬于只讀, 某些架構(gòu)也允許代碼段為可寫,即允許自修改程序。
在代碼段中,也有可能包含一些只讀的常數(shù)變量,例如字符串常量等。
text段在編譯時(shí)確定,內(nèi)存中被映射為只讀,但date段與bss段是可寫的。
2. c語言五大內(nèi)存分區(qū)棧區(qū)(堆棧區(qū)stack)
堆棧是由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)和局部變量的值(auto類型),操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。棧的申請(qǐng)是由系統(tǒng)自動(dòng)分配,如在函數(shù)內(nèi)部申請(qǐng)一個(gè)局部變量int h,同時(shí)判斷所申請(qǐng)空間是否小于棧的剩余空間,如果小于則為其開辟空間,為程序提供內(nèi)存,否則將報(bào)異常提示棧溢出。
堆(heap)
堆一般由程序員分配釋放,若程序員不釋放,程序結(jié)束可能由OS回收。
它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式類似于鏈表,申請(qǐng)則是程序員自己操作使用malloc或new。
申請(qǐng)過程比較復(fù)雜,當(dāng)系統(tǒng)收到程序的申請(qǐng)時(shí),會(huì)遍歷記錄空閑內(nèi)存地址的鏈表,以求尋找第一個(gè)空間大于所申請(qǐng)空間的堆節(jié)點(diǎn),然后將該節(jié)點(diǎn)從空閑節(jié)點(diǎn)鏈表中刪除,并將該節(jié)點(diǎn)的空間分配給程序,有些情況下,新申請(qǐng)的內(nèi)存塊的首地址記錄本次分配的內(nèi)存塊的大小,這樣在free()時(shí)能正確的釋放內(nèi)存空間。
全局靜態(tài)存儲(chǔ)區(qū)
全局變量與靜態(tài)變量的存儲(chǔ)是放在一塊的,初始化的全局變量與靜態(tài)變量存放在一塊區(qū)域,未初始化的全局變量與未初始化的靜態(tài)變量存放在相鄰的另一塊區(qū)域。
文字常量區(qū)
常量字符串就是放在該部分,只讀存儲(chǔ)區(qū),程序結(jié)束后由系統(tǒng)釋放
程序代碼區(qū)
存放程序的二進(jìn)制代碼區(qū)。
兩者之間區(qū)別是:代碼段,數(shù)據(jù)段,堆棧段是cpu級(jí)別的概念,五大分區(qū)屬于語言級(jí)別的概念,兩者是不同的概念。

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長度6~500個(gè)字
最新活動(dòng)更多
-
6月20日立即下載>> 【白皮書】精準(zhǔn)測(cè)量 安全高效——福祿克光伏行業(yè)解決方案
-
7月3日立即報(bào)名>> 【在線會(huì)議】英飛凌新一代智能照明方案賦能綠色建筑與工業(yè)互聯(lián)
-
7月22-29日立即報(bào)名>> 【線下論壇】第三屆安富利汽車生態(tài)圈峰會(huì)
-
7.30-8.1火熱報(bào)名中>> 全數(shù)會(huì)2025(第六屆)機(jī)器人及智能工廠展
-
7月31日免費(fèi)預(yù)約>> OFweek 2025具身機(jī)器人動(dòng)力電池技術(shù)應(yīng)用大會(huì)
-
免費(fèi)參會(huì)立即報(bào)名>> 7月30日- 8月1日 2025全數(shù)會(huì)工業(yè)芯片與傳感儀表展
推薦專題
- 1 AI 眼鏡讓百萬 APP「集體失業(yè)」?
- 2 大廠紛紛入局,百度、阿里、字節(jié)搶奪Agent話語權(quán)
- 3 深度報(bào)告|中國AI產(chǎn)業(yè)正在崛起成全球力量,市場(chǎng)潛力和關(guān)鍵挑戰(zhàn)有哪些?
- 4 上海跑出80億超級(jí)獨(dú)角獸:獲上市公司戰(zhàn)投,干人形機(jī)器人
- 5 國家數(shù)據(jù)局局長劉烈宏調(diào)研格創(chuàng)東智
- 6 一文看懂視覺語言動(dòng)作模型(VLA)及其應(yīng)用
- 7 下一代入口之戰(zhàn):大廠為何紛紛押注智能體?
- 8 百億AI芯片訂單,瘋狂傾銷中東?
- 9 Robotaxi新消息密集釋放,量產(chǎn)元年誰在領(lǐng)跑?
- 10 格斗大賽出圈!人形機(jī)器人致命短板曝光:頭腦過于簡單