訂閱
糾錯
加入自媒體

關鍵字static的使用方法

2021-02-01 17:30
一口Linux
關注

粉絲提問

粉絲問題,總結一下:關鍵字static的使用方法。

問題

要想搞清楚關鍵字static的使用方法,必須首先搞清楚,可執(zhí)行程序段的分類以及各段在內存區(qū)的邏輯地址的映射。

本文配套視頻,請見次條文章《【視頻講解】C語言static關鍵詞》

一、可執(zhí)行程序內存分配

1. 可執(zhí)行程序程序分段

一個程序的3個基本段:text段,data段,bss段

BSSBSS(Block Started by Symbol)通常是指用來存放程序中未初始化的全局變量和靜態(tài)變量的一塊內存區(qū)域。

特點是:可讀寫的,在程序執(zhí)行之前BSS段會自動清0。

所以,未初始的全局變量在程序執(zhí)行之前已經成0了。

注意和數據段的區(qū)別,BSS存放的是未初始化的全局變量和靜態(tài)變量,數據段存放的是初始化后的全局變量和靜態(tài)變量。

UNIX下可使用size命令查看可執(zhí)行文件的段大小信息。如size a.out。

數據段.data存放在編譯階段(而非運行時)就能確定的數據,可讀可寫。

也就是通常所說的靜態(tài)存儲區(qū),賦了初值的全局變量和賦初值的靜態(tài)變量存放在這個區(qū)域,常量也存在這個區(qū)域。數據段,代碼段在程序運行之前就已經確定了的。

代碼段.text代碼段通常是指用來存放程序執(zhí)行代碼的一塊內存區(qū)域。

這部分區(qū)域的大小在程序運行前就已經確定,并且內存區(qū)域通常屬于只讀, 某些架構也允許代碼段為可寫,即允許自修改程序。

在代碼段中,也有可能包含一些只讀的常數變量,例如字符串常量等。

text段在編譯時確定,內存中被映射為只讀,但date段與bss段是可寫的。

2. c語言五大內存分區(qū)棧區(qū)(堆棧區(qū)stack)

堆棧是由編譯器自動分配釋放,存放函數的參數和局部變量的值(auto類型),操作方式類似于數據結構中的棧。棧的申請是由系統(tǒng)自動分配,如在函數內部申請一個局部變量int h,同時判斷所申請空間是否小于棧的剩余空間,如果小于則為其開辟空間,為程序提供內存,否則將報異常提示棧溢出。

堆(heap)

堆一般由程序員分配釋放,若程序員不釋放,程序結束可能由OS回收。

它與數據結構中的堆是兩回事,分配方式類似于鏈表,申請則是程序員自己操作使用malloc或new。

申請過程比較復雜,當系統(tǒng)收到程序的申請時,會遍歷記錄空閑內存地址的鏈表,以求尋找第一個空間大于所申請空間的堆節(jié)點,然后將該節(jié)點從空閑節(jié)點鏈表中刪除,并將該節(jié)點的空間分配給程序,有些情況下,新申請的內存塊的首地址記錄本次分配的內存塊的大小,這樣在free()時能正確的釋放內存空間。

全局靜態(tài)存儲區(qū)

全局變量與靜態(tài)變量的存儲是放在一塊的,初始化的全局變量與靜態(tài)變量存放在一塊區(qū)域,未初始化的全局變量與未初始化的靜態(tài)變量存放在相鄰的另一塊區(qū)域。

文字常量區(qū)

常量字符串就是放在該部分,只讀存儲區(qū),程序結束后由系統(tǒng)釋放

程序代碼區(qū)

存放程序的二進制代碼區(qū)。

兩者之間區(qū)別是:代碼段,數據段,堆棧段是cpu級別的概念,五大分區(qū)屬于語言級別的概念,兩者是不同的概念。

1  2  3  下一頁>  
聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關注公眾號
OFweek人工智能網
獲取更多精彩內容
文章糾錯
x
*文字標題:
*糾錯內容:
聯系郵箱:
*驗 證 碼:

粵公網安備 44030502002758號