static程序員
在c語言中static恰當的使用能讓程序更加完美,細節上的嚴謹,代碼會更好,也更利於程序的維護與擴展。函數
而static使用靈活,且又有兩種徹底無關的用法,因此整理總結一下。工具
一、static修飾局部變量,成爲一個局部靜態變量。spa
二、static修飾全局變量與函數,成爲靜態全局變量與靜態函數。blog
可能會疑惑,修飾全局變量與修飾函數怎麼會是一個用法?生命週期
static涉及的東西也比較多,如下有幾個概念須要明白。內存
簡單的說也就是存儲類型,c中變量是在哪裏存放的?內存是怎麼管理的?作用域
因此內存的管理:get
①棧:局部變量,函數調用傳參的過程編譯器
②堆:動態存儲區,須要程序員去申請釋放
③數據段(data段):顯式初始化非零的全局變量(static修飾顯式初始化非0的局部變量)
④bss段:顯式初始化爲0與未初始化的全局變量(static修飾顯式初始化爲0與未初始化的局部變量)
⑤text段:代碼(函數)、只讀數據
描述變量何時誕生,何時消亡,從誕生到消亡就是這個變量的生命週期。
①局部變量(棧),生命週期便是進入函數,從變量建立到函數返回時變量死亡。
②全局變量(data/bss),生命週期是程序執行到程序結束
③堆變量,生命週期是從咱們malloc到free
描述變量的做用的代碼範圍。c的做用域規則是代碼塊做用域,便是一對花括號{}。
通常的從變量定義到{}結束,便是這個變量的做用域
全局變量與函數通常是文件做用域,即做用域是整個.c
編譯器將不少源文件編譯成不少.o文件後,每一個.o文件裏有符號、代碼段、data/bss等等的分段,連接器須要經過符號將這些內存連接起來。而這些符號就是連接屬性。
c中有三種連接屬性:外連接、內連接、無連接屬性。
外連接:外部連接,能夠在整個程序(跨文件)連接。
普通的函數與全局變量。
內連接:內部鏈接,只能在當前.c文件進行連接。
static修飾的全局變量與函數
無連接:沒有連接。
普通局部變量
①靜態局部變量做用域與鏈接屬性與普通局部變量同樣
②存儲類:靜態局部變量分配在data/bss段,普通局部變量在棧上。
③生命週期:由於存儲類的不一樣,靜態局部變量的生命週期獲得延長了,直到程序結束。
因此當局部靜態變量離開做用域後,並無銷燬,而是仍然駐留在內存當中,只不過咱們不能再對它進行訪問,直到該函數再次被調用,而且值不變。
存儲類、生命週期、做用域都同樣
差異在於static修飾全局變量\函數鏈接屬性是內鏈接,普通全局變量\普通函數是外連接
就是說static修飾全局變量\函數不能跨文件訪問調用
緣由是命名的衝突、一個大工程不是經常不是一我的完成的,不免會遇到全局變量、函數命名同樣。爲了減小這類衝突static是頗有用的工具。可是很惋惜並不能徹底解決,因此咱們應該有效的去避免減小此類狀況的發生。
若是函數僅僅被同一個源文件調用時,咱們就應該聲明該函數爲static。
......
做者:Devil-wei