C語言static關鍵字的總結

2021-09-29 01:45:33 字數 2213 閱讀 4893

宣告本文參考了兩篇部落格寫的,下面給出鏈結,

文章1文章2

在全域性變數前加上static,就變成全域性靜態變數。

存放記憶體位置:靜態儲存區

存在期限:整個程式的執行期間一直存在

初始化:如果沒有在初始化的時候賦值,就會被自動初始化為0

作用域:從定義的地方開始到檔案的結尾,並且不能被其他檔案使用。例如在a.c中定義了static int a=10;那麼在b.c中用extern int a是拿不到a的值得,a的作用域只在a.c中。

static定義的靜態區域性變數分配在資料段上,普通的區域性變數分配在棧上,會因為函式棧幀的釋放而被釋放掉。

在區域性變數前加上static,就是變成區域性靜態變數

儲存位置:靜態儲存區

存在期限:區域性(該函式的作用域)

初始化:未經初始化的全域性靜態變數會被自動初始化為0

作用域:作用域仍然為區域性作用域,當它的定義語句結束的時候,作用域結速。但是區域性靜態變數離開作用域之後,並沒有銷毀,而是任然駐留在記憶體中,只是我們不能再對它進行訪問,當再次呼叫該函式的時候,它的值任保留上次的值。

函式返回型別前加static,函式就定義為靜態函式。函式的定義和宣告在預設情況下都是extern的,但靜態函式只是在宣告他的檔案當中可見,不能被其他檔案所用。

函式的實現使用static修飾,那麼這個函式只可在本.c內使用,不會同其他.c中的同名函式引起衝突;

warning:不要在標頭檔案中宣告static的全域性函式,不要在.c內宣告非static的全域性函式,如果你要在多個.c中復用該函式,就把它的宣告提到標頭檔案裡去,否則.c內部宣告需加上static修飾;

//變數不加static,並且檔案命名為 static_none.c

#include

void

test()

intmain()

執行結果

編譯的環境是gcc編譯器

$ gcc static_none.c -o static_none

$ ./static_none

輸出

111

1111

111

//變數加上static,並把檔案命名為static_add.c

#include

void

test()

intmain()

$ gcc static_none.c -o static_none

$ ./static_none

輸出

123

4567

8910

總結:

不加static修飾,函式或者**塊中的變數在函式或者**塊執行完畢後就直接**銷毀了,每次執行都會重新分配記憶體,每次都會銷毀。

加 static 修飾,函式或者**塊中的變數在函式或者**塊執行第一次初始化分配記憶體後,就算函式或者**塊執行完畢,該變數也不會被** 銷毀,直到程式結束 static 變數才會被**。

當 static 作用於函式定義時,或者用於**塊之外的變數宣告時,static關鍵字用於修改識別符號的鏈結屬性。外部鏈結屬性變為內部鏈結屬性,識別符號的儲存型別和作用域不受影響。也就是說變數或者函式只能在當前原始檔中訪問,不能在其他原始檔中訪問。

當static 作用於**塊內部的變數宣告時,static關鍵字用於修改變數的儲存型別。從自動變數變為靜態變數,變數的屬性和作用域不受影響。

特點: static區域性變數的」記憶性」與生存期的」全域性性」

所謂」記憶性」是指在兩次函式呼叫時, 在第二次呼叫進入時, 能保持第一次呼叫退出時的值.

注意事項:

「記憶性」, 程式執行很重要的一點就是可重複性, 而static變數的」記憶性」破壞了這種可重複性, 造成不同時刻至執行的結果可能不同.

「生存期」全域性性和唯一性. 普通的local變數的儲存空間分配在stack上, 因此每次呼叫函式時, 分配的空間都可能不一樣, 而static具有全域性唯一性的特點, 每次呼叫時, 都指向同一塊記憶體, 這就造成乙個很重要的問題 —- 不可重入性

C語言關鍵字Static

c語言中static的語義 1.static變數 1 區域性 a.靜態區域性變數在函式內定義,生存期為整個源程式,但作用域與自動變數相同,只能在定義該變數的函式內使用。退出該函式後,儘管該變數還繼續存在,但不能使用它。b.對基本型別的靜態區域性變數若在說明時未賦以初值,則系統自動賦予0值。而對自動變...

c語言static關鍵字

以前一直覺得static關鍵字僅僅是定義乙個靜態的變數,今天在看書的時候發現一切沒那麼簡單,遂決定記錄下來。1.static關鍵字指明變數是乙個靜態變數,即static修飾的區域性變數並不是分配在棧中,而是分配在程式的靜態區中,所以在函式呼叫後其記憶體並不會被釋放。這裡需要注意乙個點,也就是說並不是...

C語言 關鍵字static

一 修飾區域性變數 靜態區域性變數 修飾前 include void test intmain return0 修飾後 include void test intmain return0 結論 static修飾區域性變數改變了變數的生命週期,讓靜態區域性變數出了作用域依然存在,到程式結束,生命週期才...