區域性變數和全域性變數(靜態和非靜態)區別

qq_43497365發表於2020-10-27

全域性變數和全域性靜態變數的區別

(1)全域性變數是不顯式用 static 修飾的全域性變數,全域性變數預設是有外部連結性的,作用域是整個工程,在一個檔案內定義的全域性變數,在另一個檔案中,通過 extern 全域性變數名的宣告,就可以使用全域性變數。
(2)全域性靜態變數是顯式用 static 修飾的全域性變數,作用域是宣告此變數所在的檔案,其他的檔案即使用 extern 宣告也不能使用。

靜態全域性變數有以下特點:

(1)靜態變數都在全域性資料區分配記憶體,包括後面將要提到的靜態區域性變數;
(2)未經初始化的靜態全域性變數會被程式自動初始化為0(在函式體內宣告的自動變數的值是隨機的,除非它被顯式初始化,而在函式體外被宣告的自動變數也會被初始化為 0);
(3)靜態全域性變數在宣告它的整個檔案都是可見的,而在檔案之外是不可見的。
優點:靜態全域性變數不能被其它檔案所用;其它檔案中可以定義相同名字的變數,不會發生衝突。

普通區域性變數與靜態區域性變數的區別

記憶體分配和釋放
1、普通區域性變數只有執行到變數定義的語句的時候才分配空間。
2、static區域性變數在編譯階段(函式還沒有執行),變數的空間已經分配。
3、普通區域性變數離開作用域{},自動釋放其空間,也就無法使用此變數。
4、static區域性變數只有在整個程式結束的時候才將其自動釋放。
初始化
1、普通區域性變數不初始化,為隨機值。
2、static區域性變數不初始化,為0。
3、static區域性變數初始化語句只有第一次執行時有效,但是可以賦值多次。
4、static區域性變數只能用它常量初始化。

靜態區域性變數有以下特點:

(1)該變數在全域性資料區分配記憶體;
(2)靜態區域性變數在程式執行到該物件的宣告處時被首次初始化,即以後的函式呼叫不再進行初始化;
(3)靜態區域性變數一般在宣告處初始化,如果沒有顯式初始化,會被程式自動初始化為 0;
(4)它始終駐留在全域性資料區,直到程式執行結束。但其作用域為區域性作用域,當定義它的函式或語句塊結束時,其作用域隨之結束。(延長了區域性變數的生命週期)

相關文章