static
在c語言中static恰當的使用能讓程式更加完美,細節上的嚴謹,**會更好,也更利於程式的維護與擴充套件。
而static使用靈活,且又有兩種完全無關的用法,所以整理總結一下。
1、static修飾區域性變數,成為乙個區域性靜態變數。
2、static修飾全域性變數與函式,成為靜態全域性變數與靜態函式。
可能會疑惑,修飾全域性變數與修飾函式怎麼會是乙個用法?
static涉及的東西也比較多,以下有幾個概念需要明白。
簡單的說也就是儲存型別,c中變數是在**存放的?記憶體是怎麼管理的?
所以記憶體的管理:
①棧:區域性變數,函式呼叫傳參的過程
②堆:動態儲存區,需要程式設計師去申請釋放
③資料段(data段):顯式初始化非零的全域性變數(static修飾顯式初始化非0的區域性變數)
④bss段:顯式初始化為0與未初始化的全域性變數(static修飾顯式初始化為0與未初始化的區域性變數)
⑤text段:**(函式)、唯讀資料
描述變數什麼時候誕生,什麼時候消亡,從誕生到消亡就是這個變數的生命週期。
①區域性變數(棧),生命週期即是進入函式,從變數建立到函式返回時變數死亡。
②全域性變數(data/bss),生命週期是程式執行到程式結束
③堆變數,生命週期是從我們malloc到free
描述變數的作用的**範圍。c的作用域規則是**塊作用域,即是一對花括號{}。
一般的從變數定義到{}結束,即是這個變數的作用域
全域性變數與函式一般是檔案作用域,即作用域是整個.c
編譯器將很多原始檔編譯成很多.o檔案後,每個.o檔案裡有符號、**段、data/bss等等的分段,鏈結器需要通過符號將這些記憶體鏈結起來。而這些符號就是鏈結屬性。
普通的函式與全域性變數。
static修飾的全域性變數與函式
普通區域性變數
①靜態區域性變數作用域與連線屬性與普通區域性變數一樣
②儲存類:靜態區域性變數分配在data/bss段,普通區域性變數在棧上。
③生命週期:因為儲存類的不同,靜態區域性變數的生命週期得到延長了,直到程式結束。
所以當區域性靜態變數離開作用域後,並沒有銷毀,而是仍然駐留在記憶體當中,只不過我們不能再對它進行訪問,直到該函式再次被呼叫,並且值不變。
儲存類、生命週期、作用域都一樣
差別在於static修飾全域性變數\函式連線屬性是內連線,普通全域性變數\普通函式是外鏈結
就是說static修飾全域性變數\函式不能跨檔案訪問呼叫
原因是命名的衝突、乙個大工程不是常常不是乙個人完成的,難免會遇到全域性變數、函式命名一樣。為了減少這類衝突static是很有用的工具。但是很可惜並不能完全解決,所以我們應該有效的去避免減少此類情況的發生。
如果函式僅僅被同乙個原始檔呼叫時,我們就應該宣告該函式為static。
出處:
c語言static關鍵字的理解
在c語言中static恰當的使用能讓程式更加完美,細節上的嚴謹,會更好,也更利於程式的維護與擴充套件。而static使用靈活,且又有兩種完全無關的用法,所以整理總結一下。1 static修飾區域性變數,成為乙個區域性靜態變數。2 static修飾全域性變數與函式,成為靜態全域性變數與靜態函式。可能會...
C語言關鍵字Static
c語言中static的語義 1.static變數 1 區域性 a.靜態區域性變數在函式內定義,生存期為整個源程式,但作用域與自動變數相同,只能在定義該變數的函式內使用。退出該函式後,儘管該變數還繼續存在,但不能使用它。b.對基本型別的靜態區域性變數若在說明時未賦以初值,則系統自動賦予0值。而對自動變...
c語言static關鍵字
以前一直覺得static關鍵字僅僅是定義乙個靜態的變數,今天在看書的時候發現一切沒那麼簡單,遂決定記錄下來。1.static關鍵字指明變數是乙個靜態變數,即static修飾的區域性變數並不是分配在棧中,而是分配在程式的靜態區中,所以在函式呼叫後其記憶體並不會被釋放。這裡需要注意乙個點,也就是說並不是...