c語言static關鍵字的理解


static

一、概述

在c語言中static恰當的使用能讓程序更加完美,細節上的嚴謹,代碼會更好,也更利於程序的維護與擴展。

而static使用靈活,且又有兩種完全無關的用法,所以整理總結一下。

二、static的兩種用法:

1、static修飾局部變量,成為一個局部靜態變量。

2、static修飾全局變量與函數,成為靜態全局變量與靜態函數。

 

三、相關涉及概念

  可能會疑惑,修飾全局變量與修飾函數怎么會是一個用法?

  static涉及的東西也比較多,以下有幾個概念需要明白。

 

 1、什么是存儲類

  簡單的說也就是存儲類型,c中變量是在哪里存放的?內存是怎么管理的?

  所以內存的管理:

①棧:局部變量,函數調用傳參的過程

②堆:動態存儲區,需要程序員去申請釋放

③數據段(data段):顯式初始化非零的全局變量(static修飾顯式初始化非0的局部變量)

④bss段:顯式初始化為0與未初始化的全局變量(static修飾顯式初始化為0與未初始化的局部變量)

⑤text段:代碼(函數)、只讀數據

 

2、什么是生命周期

描述變量什么時候誕生,什么時候消亡,從誕生到消亡就是這個變量的生命周期。

①局部變量(棧),生命周期即是進入函數,從變量創建到函數返回時變量死亡。

②全局變量(data/bss),生命周期是程序執行到程序結束

③堆變量,生命周期是從我們malloc到free

 

3、什么是作用域

描述變量的作用的代碼范圍。c的作用域規則是代碼塊作用域,即是一對花括號{}。

一般的從變量定義到{}結束,即是這個變量的作用域

全局變量與函數一般是文件作用域,即作用域是整個.c

 

4、什么是鏈接屬性

編譯器將很多源文件編譯成很多.o文件后,每個.o文件里有符號、代碼段、data/bss等等的分段,鏈接器需要通過符號將這些內存鏈接起來。而這些符號就是鏈接屬性。

c中有三種鏈接屬性:外鏈接、內鏈接、無鏈接屬性

外鏈接:外部鏈接,可以在整個程序(跨文件)鏈接。

    普通的函數與全局變量。

內鏈接:內部連接,只能在當前.c文件進行鏈接。

    static修飾的全局變量與函數

無鏈接:沒有鏈接。

      普通局部變量 

 

四、具體分析static的兩種用法

1、static修飾局部變量(靜態局部變量)與普通局部變量相比

①靜態局部變量作用域與連接屬性與普通局部變量一樣

②存儲類:靜態局部變量分配在data/bss段,普通局部變量在棧上。

③生命周期:因為存儲類的不同,靜態局部變量的生命周期得到延長了,直到程序結束。

所以當局部靜態變量離開作用域后,並沒有銷毀,而是仍然駐留在內存當中,只不過我們不能再對它進行訪問,直到該函數再次被調用,並且值不變。

2、static修飾全局變量\函數 與 普通全局變量\普通函數相比

存儲類、生命周期、作用域都一樣

差別在於static修飾全局變量\函數連接屬性是內連接,普通全局變量\普通函數是外鏈接

就是說static修飾全局變量\函數不能跨文件訪問調用

 

五、補充:為什么需要這樣?

原因是命名的沖突、一個大工程不是常常不是一個人完成的,難免會遇到全局變量、函數命名一樣。為了減少這類沖突static是很有用的工具。但是很可惜並不能完全解決,所以我們應該有效的去避免減少此類情況的發生。

如果函數僅僅被同一個源文件調用時,我們就應該聲明該函數為static。

  ......

 


 

 作者:Devil-wei

出處:https://www.cnblogs.com/Devil-wei/

版權聲明:本文版權歸作者,轉載請標注文章作者與出處


免責聲明!

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



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