標籤:
一個進程在記憶體中的布局:
.text段(本文段)——儲存程式所執行的程式二進位檔案,CPU執行的機器指令部分;一個程式只有一個副本;唯讀,防止程式由於意外事故而修改自身指令。
.data段(資料區段)——儲存程式中所有已初始化的全域變數。
.bss段(非初始化資料區段)——儲存程式中所有未初始化的全域變數(其他段中還有很多亂七八糟的段,暫且不表)。
在程式的整個生命週期中,.data段和.bss段內的資料時跟整個程式同生共死的,也就是在程式完全結束之後這些資料才會壽終就寢。
當一個程式的全域變數被聲明為static之後,它的中文名叫靜態全域變數。靜態全域變數和其他的全域變數的儲存地點並沒有區別,都是在.data段(已初始化)或者.bss段(未初始化)內,但是它只在定義它的源檔案內有效,其他源檔案無法訪問它。所以,普通全域變數穿上static外衣後,它就變成了新娘,已心有所屬,只能被定義它的源檔案(新郎)中的變數或函數訪問。
棧——增長方向:自頂向下增長,即是由高地址向低地址增長;自動變數以及每次函數調用時所需要儲存的資訊(返回地址;環境資訊)。
堆——動態儲存裝置分配。
Static和堆棧的關係:
static在C裡面可以用來修飾變數,也可以用來修飾函數。
先看用來修飾變數的時候。變數在c裡面可分為存在全域資料區、棧和堆裡。其實我們平時所說的堆棧是棧而不是堆,不要弄混。
int a ;
int main()
{
int b ;
Int* c = (int *)malloc(sizeof(int));
}
a是全域變數,b是棧變數,c是堆變數(動態分配空間)。
static對全域變數的修飾,可以認為是限制了只能是本檔案引用此變數。有的程式是由好多.c檔案構成。彼此可以互相引用變數,但加入static修飾之後,只能被本檔案中函數引用此變數。
static對棧變數的修飾,可以認為棧變數的生命週期延長到程式執行結束時。一般來說,棧變數的生命週期由OS管理,在退棧的過程中,棧變數的生命也就結束了。但加入static修飾之後,變數已經不再儲存在棧中,而是和全域變數一起儲存。同時,離開定義它的函數後不能使用,但如再次調用定義它的函數時,它又可繼續使用, 而且儲存了前次被調用後留下的值。
static對函數的修飾與對全域變數的修飾相似,只能被本檔案中的函數調用,而不能被同一程式其它檔案中的函數調用。
C語言結構