變數的儲存方式和生存期

2022-03-20 13:13:15 字數 2622 閱讀 6626

從變數的作用域(即從空間)角度來分,可以分為全域性變數和區域性變數。 

另乙個角度,從變數值存在的作時間(即生存期)角度來分,可以分為靜態儲存方式和動態儲存方式。 

靜態儲存方式:是指在程式執行期間分配固定的儲存空間的方式。 

動態儲存方式:是在程式執行期間根據需要進行動態的分配儲存空間的方式。 

使用者儲存空間可以分為三個部分: 

1)  程式區; 

2)  靜態儲存區; 

3)  動態儲存區;

全域性變數全部存放在靜態儲存區,在程式開始執行時給全域性變數分配儲存區,程式行完畢就釋放。在程式執行過程中它們佔據固定的儲存單元,而不動態地進行分配和釋放;動態儲存區存放以下資料: 

1)  函式形式引數; 

2)  自動變數(未加 static 宣告的區域性變數); 

3)  函式呼叫實的現場保護和返回位址; 

對以上這些資料,在函式開始呼叫時分配動態儲存空間,函式結束時釋放這些空間。在 c 語言中,每個變數和函式有兩個屬性:資料型別和資料的儲存類別。

一 區域性變數的類別:

1 auto變數 

函式中的區域性變數,如不專門宣告為 static 儲存類別,都是動態地分配儲存空間的,資料儲存在動態儲存區中。函式中的形參和在函式中定義的變數(包括在復合語句中定義的變數),都屬此類,在呼叫該函式時系統會給它們分配儲存空間,在函式呼叫結束時就自動釋放這些儲存空間。這類區域性變數稱為自動變數。自動變數用關鍵字 auto 作儲存類別的宣告。

2 用 static宣告區域性變數 

有時希望函式中的區域性變數的值在函式呼叫結束後不消失而保留原值,這時就應該指定區域性變數為「靜態區域性變數」,用關鍵字 static 進行宣告。  

對靜態區域性變數的說明: 

1)  靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元。在程式整個執行期間都不釋放。而自動變數(即動態區域性變數)屬於動態儲存類別,佔動態儲存空間,函式呼叫結束後即釋放。

2)  靜態區域性變數在編譯時賦初值,即只賦初值一次;而對自動變數賦初值是在函式呼叫時進行,每呼叫一次函式重新給一次初值,相當於執行一次賦值語句。

3)  如果在定義區域性變數時不賦初值的話,則對靜態區域性變數來說,編譯時自動賦初值 0 (對數值型變數)或空字元(對字元變數)。而對自動變數來說,如果不賦初值則它的值是乙個不確定的值。

無論加什麼,他都是區域性變數。

例子:int fac(int n)

3 register變數 

為了提高效率,c 語言允許將區域性變數得值放在 cpu 中的暫存器中,這種變數叫「暫存器變數」,用關鍵字 register 作宣告。

說明: 

1)  只有區域性自動變數和形式引數可以作為暫存器變數; 

2)  乙個計算機系統中的暫存器數目有限,不能定義任意多個暫存器變數; 

3)  區域性靜態變數不能定義為暫存器變數。

注意:區域性變數預設為auto的儲存類別。即動態儲存類別。

二 全域性變數 

對全域性變數來說,都是存在於靜態儲存區,但是存在乙個作用域的問題。

1 在乙個檔案內擴充套件外部變數的作用域

外部變數(即全域性變數)是在函式的外部定義的,它的作用域為從變數定義處開始,到本程式檔案的末尾。如果外部變數不在檔案的開頭定義,其有效的作用範圍只限於定義處到檔案終了。如果在定義點之前的函式想引用該外部變數,則應該在引用之前用關鍵字 extern對該變數作「外部變數宣告」。表示該變數是乙個已經定義的外部變數。有了此宣告,就可以從「宣告」處起,合法地使用該外部變數。

如:extern int a;

下面有 int a;

2 將外部變數的作用域擴充套件到其他檔案中

如 file1.c 中 int a;如果file2.c 中extern a就擴充套件到檔案2中了。

3 將外部變數的作用域限制在本檔案中

在程式設計設計中希望一些外部變數只限於被本檔案引用,而不能被其他檔案引用。這時可以再定義外部變數時加乙個static宣告。

如在檔案開頭寫上 static int a;

這種加上static宣告、只能用於本檔案的外部變數稱為:靜態外部變數

這種寫法的意義:

由於程式設計常由若干個人完成各個模組,

個人獨立的在其

設計的檔案中使用相同的外部檔名而互不相干,只需在每個檔案中定義外部變數時加上static即可

。這樣就為程式的模組化,通用性提供了方便。

注意:不要誤認為外部變數加static宣告後才採取靜態儲存方式,外部變數都是靜態儲存方式的。

static的作用

a.對區域性變數宣告,把他分配在靜態儲存區。

b.對全域性變數宣告,把該變數的作用域限於本檔案中。

注意:全域性變數預設為:int a的形式。作用域為:  從變數定義處開始,到本程式檔案的末尾。

記憶體區域的劃分:

棧區:由編譯器自動分配和釋放的記憶體區域,用於存放函式的引數值,區域性變數的值等。隨著函式的呼叫和返回,棧區的資料將動態變化。

堆區:程式設計師向系統申請或釋放。若程式設計師在程式結束時還沒有釋放,則可能由作業系統**。malloc.

全域性區:用來儲存全域性變數和靜態變數。在進入程式時分配區域,程式結束後由系統釋放。

文字常量區:用於儲存常量字串的記憶體區域,程式結束後,由系統釋放。

程式**區:用於儲存函式體的二進位制**。

變數的儲存方式和生存期

靜態儲存方式和動態儲存方式 靜態儲存方式是指在程式執行期間由系統分配固定的儲存空間的方式。動態儲存方式是在程式運氣期間根據需要進行動態的分配儲存空間的方式。記憶體中供使用者使用的儲存空間分為三個部分 1 程式區 2 靜態儲存區 3 動態儲存區。c的儲存型別包括四種 自動的 auto 靜態的 stat...

變數的儲存方式和生存期

一 儲存空間的情況 使用者區程式區 靜態儲存區 動態儲存區 靜態儲存方式 在程式執行期間由系統分配固定的儲存空間的方式。動態儲存方式 在程式執行期間根據需要進行動態的分配儲存空間的方式。二 資料儲存位置 靜態儲存區 全域性變數全部存放在靜態儲存區。動態儲存區 1 函式形式引數。2 函式中定義的沒有用...

變數生存期

統計共呼叫counter 函式多少次。count.c檔案 include intmain mycounter.c counter 函式 void counter 函式宣告 void counter 執行結果為 count 1,結果不對。因為counter 函式中的count是區域性變數,自動儲存,每...