c語言static關鍵字的理解

static程序員

1、概述

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

而static使用靈活,且又有兩種徹底無關的用法,因此整理總結一下。工具

2、static的兩種用法:

一、static修飾局部變量,成爲一個局部靜態變量。spa

二、static修飾全局變量與函數,成爲靜態全局變量與靜態函數。blog

 

3、相關涉及概念

  可能會疑惑,修飾全局變量與修飾函數怎麼會是一個用法?生命週期

  static涉及的東西也比較多,如下有幾個概念須要明白。內存

 

 一、什麼是存儲類

  簡單的說也就是存儲類型,c中變量是在哪裏存放的?內存是怎麼管理的?作用域

  因此內存的管理:get

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

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

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

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

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

 

二、什麼是生命週期

描述變量何時誕生,何時消亡,從誕生到消亡就是這個變量的生命週期。

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

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

③堆變量,生命週期是從咱們malloc到free

 

三、什麼是做用域

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

通常的從變量定義到{}結束,便是這個變量的做用域

全局變量與函數通常是文件做用域,即做用域是整個.c

 

四、什麼是連接屬性

編譯器將不少源文件編譯成不少.o文件後,每一個.o文件裏有符號、代碼段、data/bss等等的分段,連接器須要經過符號將這些內存連接起來。而這些符號就是連接屬性。

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

外連接:外部連接,能夠在整個程序(跨文件)連接。

    普通的函數與全局變量。

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

    static修飾的全局變量與函數

無連接:沒有連接。

      普通局部變量 

 

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

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

①靜態局部變量做用域與鏈接屬性與普通局部變量同樣

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

③生命週期:由於存儲類的不一樣,靜態局部變量的生命週期獲得延長了,直到程序結束。

因此當局部靜態變量離開做用域後,並無銷燬,而是仍然駐留在內存當中,只不過咱們不能再對它進行訪問,直到該函數再次被調用,而且值不變。

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

存儲類、生命週期、做用域都同樣

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

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

 

5、補充:爲何須要這樣?

緣由是命名的衝突、一個大工程不是經常不是一我的完成的,不免會遇到全局變量、函數命名同樣。爲了減小這類衝突static是頗有用的工具。可是很惋惜並不能徹底解決,因此咱們應該有效的去避免減小此類狀況的發生。

若是函數僅僅被同一個源文件調用時,咱們就應該聲明該函數爲static。

  ......

 


 

 做者:Devil-wei

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

相關文章
相關標籤/搜索