訂閱
糾錯
加入自媒體

關(guān)鍵字static的使用方法

3. 可執(zhí)行程序內(nèi)存空間與邏輯地址空間的映射與劃分

左邊是UNIX系統(tǒng)的執(zhí)行文件,右邊是進程對應的邏輯地址空間的劃分情況

4. 舉例

二、static 變量

static變量主要區(qū)分靜態(tài)全局變量和全局變量、局部變量和靜態(tài)局部變量之間的區(qū)別。

1. 靜態(tài)全局變量、全局變量

靜態(tài)全局變量、全局變量的區(qū)別主要通過生存周期和作用域來區(qū)別。

全局變量靜態(tài)全局變量生存周期程序運行到程序結(jié)束程序運行開始到程序結(jié)束作用域所有的代碼只有當前文件可以訪問代碼段中位置全局數(shù)據(jù)區(qū)全局數(shù)據(jù)區(qū)a.靜態(tài)全局變量和全局變量均存放在數(shù)據(jù)段.data中;b. 靜態(tài)局部變量在函數(shù)內(nèi)定義,生存期為整個源程序,但作用域與自動變量相同,只能在定義該變量的函數(shù)內(nèi)使用。退出該函數(shù)后, 盡管該變量還繼續(xù)存在,但不能使用它。c. 對基本類型的靜態(tài)局部變量若在說明時未賦以初值,則系統(tǒng)自動賦予0值。而對自動變量不賦初值,則其值是不定的。d.全局變量本身就是靜態(tài)存儲方式, 靜態(tài)全局變量當然也是靜態(tài)存儲方式。但是他們的作用域,非靜態(tài)全局 變量的作用域是整個源程序(多個源文件可以共同使用);而靜態(tài)全局變量則限制了其作用域, 即只在定義該變量的源文件內(nèi)有效, 在同一源程序的其它源文件中不能使用它。全局變量實例

以下是b.c 和 a.c源代碼

全局變量

編譯

gcc a.c b.c

執(zhí)行結(jié)果:

執(zhí)行結(jié)果

由編譯結(jié)果可知,文件a.c可以訪問到b.c文件中的靜態(tài)全局變量b。

靜態(tài)全局變量實例

編譯結(jié)果

編譯結(jié)果

由編譯結(jié)果可知,文件a.c無法訪問到b.c文件中的靜態(tài)全局變量b,所以編譯報錯。

2. 靜態(tài)局部變量、局部變量

靜態(tài)局部變量、局部變量的區(qū)別主要通過生存周期和作用域來區(qū)別。


局部變量靜態(tài)局部變量生存周期函數(shù)調(diào)用到函數(shù)返回程序運行開始到程序結(jié)束作用域函數(shù)內(nèi)部函數(shù)內(nèi)部代碼段中位置棧全局數(shù)據(jù)區(qū)

靜態(tài)局部變量存放在數(shù)據(jù)段.data中,局部變量在棧中;靜態(tài)局部變量和局部變量都只能在函數(shù)體內(nèi)部才可以訪問。

函數(shù)每次訪問的靜態(tài)局部變量,該變量的值為最后一次訪問修改后的值。

舉例:

 1 #include <stdio.h>
 2
 3
 4 void func()
 5 {
 6     int aa = 11;
 7
 8     printf("aa= %d ",aa++);
 9
10 }
11
12 int main(int argc, char **argv)
13 {
14
15     func();                                                                                    
16     func();
17
18     return 0;
19 }

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

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

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

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

暫無評論

暫無評論

    掃碼關(guān)注公眾號
    OFweek人工智能網(wǎng)
    獲取更多精彩內(nèi)容
    文章糾錯
    x
    *文字標題:
    *糾錯內(nèi)容:
    聯(lián)系郵箱:
    *驗 證 碼:

    粵公網(wǎng)安備 44030502002758號