C語言中static修飾符的意義


在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();
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM