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

發(fā)表評論
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
-
7月8日立即報名>> 【在線會議】英飛凌新一代智能照明方案賦能綠色建筑與工業(yè)互聯(lián)
-
7月22-29日立即報名>> 【線下論壇】第三屆安富利汽車生態(tài)圈峰會
-
7.30-8.1火熱報名中>> 全數(shù)會2025(第六屆)機(jī)器人及智能工廠展
-
7月31日免費(fèi)預(yù)約>> OFweek 2025具身智能機(jī)器人產(chǎn)業(yè)技術(shù)創(chuàng)新應(yīng)用論壇
-
免費(fèi)參會立即報名>> 7月30日- 8月1日 2025全數(shù)會工業(yè)芯片與傳感儀表展
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書》
推薦專題