關於static變數的定義及性質的深層介紹
阿新 • • 發佈:2018-11-28
1.static全域性變數
我們知道,一個程序在記憶體中的佈局如圖1所示:
其中.text段儲存程序所執行的程式二進位制檔案,.data段儲存程序所有的已初始化的全域性變數,.bss段儲存程序未初始化的全域性變數(其他段中還有很多亂七八糟的段,暫且不表)。在程序的整個生命週期中,.data段和.bss段內的資料時跟整個程序同生共死的,也就是在程序結束之後這些資料才會壽終就寢。 當一個程序的全域性變數被宣告為static之後,它的中文名叫靜態全域性變數。靜態全域性變數和其他的全域性變數的儲存地點並沒有區別,都是在.data段(已初始化)或者.bss段(未初始化)內,但是它只在定義它的原始檔內有效,其他原始檔無法訪問它。所以,普通全域性變數穿上static外衣後,它就變成了新娘,已心有所屬,只能被定義它的原始檔(新郎)中的變數或函式訪問。
作者:keyeagle
來源:CSDN
原文:https://blog.csdn.net/keyeagle/article/details/6708077
版權宣告:本文為博主原創文章,轉載請附上博文連結!
2.static 區域性變數
普通的區域性變數在棧空間上分配,這個區域性變數所在的函式被多次呼叫時,每次呼叫這個區域性變數在棧上的位置都不一定相同。區域性變數也可以在堆上動態分配,但是記得使用完這個堆空間後要釋放之。
static區域性變數中文名叫靜態區域性變數。它與普通的區域性變數比起來有如下幾個區別:
1)位置:靜態區域性變數被編譯器放在全域性儲存區.data(注意:不在.bss段內,原因見3)),所以它雖然是區域性的,但是在程式的整個生命週期中存在。
2)訪問許可權:靜態區域性變數只能被其作用域內的變數或函式訪問。也就是說雖然它會在程式的整個生命週期中存在,由於它是static的,它不能被其他的函式和原始檔訪問。
3)值:靜態區域性變數如果沒有被使用者初始化,則會被編譯器自動賦值為0,以後每次呼叫靜態區域性變數的時候都用上次呼叫後的值。這個比較好理解,每次函式呼叫靜態區域性變數的時候都修改它然後離開,下次讀的時候從全域性儲存區讀出的靜態區域性變數就是上次修改後的值。
作者:keyeagle
來源:CSDN
原文:https://blog.csdn.net/keyeagle/article/details/6708077
版權宣告:本文為博主原創文章,轉載請附上博文連結!