關鍵字static的使用方法
3. 可執(zhí)行程序內存空間與邏輯地址空間的映射與劃分
左邊是UNIX系統(tǒng)的執(zhí)行文件,右邊是進程對應的邏輯地址空間的劃分情況
4. 舉例
二、static 變量
static變量主要區(qū)分靜態(tài)全局變量和全局變量、局部變量和靜態(tài)局部變量之間的區(qū)別。
1. 靜態(tài)全局變量、全局變量
靜態(tài)全局變量、全局變量的區(qū)別主要通過生存周期和作用域來區(qū)別。
全局變量靜態(tài)全局變量生存周期程序運行到程序結束程序運行開始到程序結束作用域所有的代碼只有當前文件可以訪問代碼段中位置全局數(shù)據(jù)區(qū)全局數(shù)據(jù)區(qū)a.靜態(tài)全局變量和全局變量均存放在數(shù)據(jù)段.data中;b. 靜態(tài)局部變量在函數(shù)內定義,生存期為整個源程序,但作用域與自動變量相同,只能在定義該變量的函數(shù)內使用。退出該函數(shù)后, 盡管該變量還繼續(xù)存在,但不能使用它。c. 對基本類型的靜態(tài)局部變量若在說明時未賦以初值,則系統(tǒng)自動賦予0值。而對自動變量不賦初值,則其值是不定的。d.全局變量本身就是靜態(tài)存儲方式, 靜態(tài)全局變量當然也是靜態(tài)存儲方式。但是他們的作用域,非靜態(tài)全局 變量的作用域是整個源程序(多個源文件可以共同使用);而靜態(tài)全局變量則限制了其作用域, 即只在定義該變量的源文件內有效, 在同一源程序的其它源文件中不能使用它。全局變量實例
以下是b.c 和 a.c源代碼
全局變量
編譯
gcc a.c b.c
執(zhí)行結果:
執(zhí)行結果
由編譯結果可知,文件a.c可以訪問到b.c文件中的靜態(tài)全局變量b。
靜態(tài)全局變量實例
編譯結果
編譯結果
由編譯結果可知,文件a.c無法訪問到b.c文件中的靜態(tài)全局變量b,所以編譯報錯。
2. 靜態(tài)局部變量、局部變量
靜態(tài)局部變量、局部變量的區(qū)別主要通過生存周期和作用域來區(qū)別。
局部變量靜態(tài)局部變量生存周期函數(shù)調用到函數(shù)返回程序運行開始到程序結束作用域函數(shù)內部函數(shù)內部代碼段中位置棧全局數(shù)據(jù)區(qū)
靜態(tài)局部變量存放在數(shù)據(jù)段.data中,局部變量在棧中;靜態(tài)局部變量和局部變量都只能在函數(shù)體內部才可以訪問。
函數(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 }

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