c語言static關鍵字的理解

2022-09-01 08:57:13 字數 1625 閱讀 9225

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修飾的區域性變數並不是分配在棧中,而是分配在程式的靜態區中,所以在函式呼叫後其記憶體並不會被釋放。這裡需要注意乙個點,也就是說並不是...