在C語言中,static通常有2種含義:1)定義變量的生命周期;2)定義變量或者函數的作用域。
變量的生命周期是指,相對於程序運行的進程生命周期,變量存在的時間段。變量的生命周期由變量的存儲類型(位置)決定。因此static的第1種含義也可以理解為,static定義了變量的存儲類型(位置)。
C語言中,變量存儲位置分為棧、全局靜態區、堆。棧用來做函數調用,參數傳遞等,在程序的運行過程中是操作最頻繁的數據區。全局靜態區,是變量一直存在於內存中,在程序整個運行過程中不會被銷毀。堆,是由操作系統維護的大空間內存伸縮區,進程可以主動向操作系統申請使用堆的存儲,在程序運行過程中動態申請。
由static修飾的變量,其存儲類型為全局靜態區,變量在程序的整個運行過程中不會被銷毀,並且只會被初始化1次。
代碼1:static修飾變量的生命周期(存儲類型)
void func1() { static int var1 = 1; // 在全局靜態區分配變量var1的存儲空間 int var2 = 1; // 在棧上分配var2的存儲空間 var1 = var1+1; var2 = var2+1; printf("var1=%d, var2=%d", var1, var2) } void main() { func1(); func1(); func1(); }
代碼輸出:
“var1=2, var2=2”
“var1=3, var2=2”
“var1=4, var2=2”
作用域是指變量/函數的可見區域,可被引用區域。在C語言中,不加static修飾的函數對所有的源文件都是可見的,不加static修飾的全局變量對所有的源文件都是可見的。通過static修飾,可以把函數的作用域限定在本源文件內,把全局變量的作用域限定在本源文件內。
由於全局變量和函數的作用域是所有源文件,所有源文件引用的是同一個全局變量和函數,因此C語言不允許在2個源文件內定義相同的全局變量、函數,在代碼鏈接階段會提示鏈接錯誤。通過添加static修飾,可以讓2個源文件定義相同的全局變量和函數,但是注意這2個源文件引用的全局變量和函數是獨立的。
static常見使用場合
static int var1 = 1; // 限定全局變量var1僅在本源文件可見 static void func1() // 限定函數僅在本源文件可見 { static int var2 =1; // var2是靜態變量,不是棧變量,只被初始化一次 } void main() { func1(); }