C語言結構

來源:互聯網
上載者:User

標籤:

一個進程在記憶體中的布局:

      

.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語言結構

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.