C 靜態儲存,動態儲存

2021-09-08 01:22:07 字數 2649 閱讀 9176

什麼是靜態儲存,動態儲存

靜態儲存變數通常是在變數定義時就分定儲存單元並一直保持不變, 直至整個程式結束。

動態儲存變數是在程式執行過程中,使用它時才分配儲存單元, 使用完畢立即釋放。

典型的例子是函式的形式引數,在函式定義時並不給形參分配儲存單元,只是在函式被呼叫時,才予以分配,

呼叫函式完畢立即釋放。如果乙個函式被多次呼叫,則反覆地分配、 釋放形參變數的儲存單元。

從以上分析可知, 靜態儲存變數是一直存在的, 而動態儲存變數則時而存在時而消失。

我們又把這種由於變數儲存方式不同而產生的特性稱變數的生存期。 生存期表示了變數存在的時間。

生存期和作用域是從時間和空間這兩個不同的角度來描述變數的特性,這兩者既有聯絡,又有區別。

乙個變數究竟屬於哪一種儲存方式, 並不能僅從其作用域來判斷,還應有明確的儲存型別說明。

四種變數的儲存方式和作用域

在c語言中,有以下四種變數:靜態變數(static)、自動變數(auto)、暫存器變數(register)、外部變數(extern)。

其中自動變數和暫存器變數屬於動態儲存方式,外部變數和靜態區域性變數屬於靜態儲存方式。

下面我們詳細介紹這四種變數:

一、靜態區域性變數-靜態儲存

定義格式:

static 資料型別 變數名;

儲存特點:

靜態區域性變數屬於靜態儲存。

在程式執行過程中,即使所在函式呼叫結束也不釋放。

換句話說,在程式執行期間,靜態區域性變數始終存在,但其它函式是不能引用它們的。

初始化:

定義但不初始化,則自動賦以"0"(整型和實型)或'\0'(字元型);

且每次呼叫它們所在的函式時,不再重新賦初值,只是保留上次呼叫結束時的值!

二、自動變數-動態儲存

定義格式:

[auto] 資料型別 變數名;

儲存特點:

自動變數屬於動態儲存方式。

在函式或復合語句中定義的自動變數,只在該函式復合語句內有效;函式復合語句被呼叫時分配儲存空間,呼叫結束就釋放。

初始化:

定義而不初始化,則其值是不確定的。

如果初始化,則賦初值操作是在呼叫時進行的,且每次呼叫都要重新賦一次初值。

由於自動變數的作用域和生存期,都侷限於定義它的個體內(函式或復合語句),

因此不同的個體中允許使用同名的變數而不會混淆。

即使在函式內定義的自動變數,也可與該函式內部的復合語句中定義的自動變數同名。

建議:系統不會混淆,並不意味著人也不會混淆,所以盡量少用同名自動變數!

自動變數與靜態區域性變數的示例如下:

void

auto_static()

void

main()

輸出結果:

三、暫存器變數-動態儲存

儲存特點:

一般情況下,變數的值都是儲存在記憶體中的。

為提高執行效率,c語言允許將區域性變數的值存放到暫存器中,這種變數就稱為暫存器變數。

定義格式:

register 資料型別 變數名;

暫存器變數需要注意以下幾點:

1)只有區域性變數才能定義成暫存器變數,即全域性變數不行。

2)對暫存器變數的實際處理,隨系統而異。例如,微機上的msc和tc 將暫存器變數實際當作自動變數處理。

3)允許使用的暫存器數目是有限的,不能定義任意多個暫存器變數。

四、外部變數-靜態儲存

儲存特點:

外部變數屬於靜態儲存方式。又分為靜態外部變數和非靜態外部變數

靜態外部變數

只允許被本原始檔中的函式引用

定義格式: static 資料型別 外部變數名;

非靜態外部變數

允許被其它原始檔中的函式引用

定義時預設static關鍵字的外部變數,即為非靜態外部變數。

定義格式:資料型別 外部變數名;

其它原始檔中的函式,引用非靜態外部變數時,需要在引用函式所在的原始檔中進行說明:

格式:extern 資料型別 外部變數表;

靜態區域性變數和靜態外部變數同屬靜態儲存方式,但兩者區別較大:

1)定義的位置不同。

靜態區域性變數在函式內定義,靜態外部變數在函式外定義。

2)作用域不同。

靜態區域性變數屬於內部變數,其作用域僅限於定義它的函式內;

雖然生存期為整個源程式,但其它函式是不能使用它的。

靜態外部變數在函式外定義,其作用域為定義它的原始檔內;

生存期為整個源程式,但其它原始檔中的函式也是不能使用它的。

3)初始化處理不同。

靜態區域性變數,僅在第1次呼叫它所在的函式時被初始化,

當再次呼叫定義它的函式時,不再初始化,而是保留上1次呼叫結束時的值。

而靜態外部變數是在函式外定義的,不存在靜態內部變數的「重複」初始化問題,

其當前值由最近1次給它賦值的操作決定。

把區域性變數改變為靜態內部變數後,改變了它的儲存方式,即改變了它的生存期。

把外部變數改變為靜態外部變數後,改變了它的作用域,限制了它的使用範圍。

因此,關鍵字「static」在不同的地方所起的作用是不同的。

C 筆記 自動儲存 靜態儲存和動態儲存

c 有3中管理資料記憶體的方式 自動儲存 靜態儲存和動態儲存,以這三種方式分配的資料物件各不相同。自動儲存。在函式內部定義的常規變數使用自動儲存空間,稱為自動變數,他們在所屬的函式被呼叫時自動產生,在該函式結束時消亡。自動變數是乙個區域性變數,其作用域為包含它的 塊。自動變數通常儲存在棧中。在執行 ...

靜態儲存與動態儲存

靜態儲存變數通常是在變數定義時就分定儲存單元並一直保持不變,直至整個程式結束。5.5.1節中介紹的全域性變數即屬於此類儲存方式。動態儲存變數是在程式執行過程中,使用它時才分配儲存單元,使用完畢立即釋放。典型的例子是函式的形式引數,在函式定義時並不給形參分配儲存單元,只是在函式被呼叫時,才予以分配,呼...

C語言基礎 靜態儲存和動態儲存

一 儲存方式 變數從變數值存在的時間 即生存期 角度分 靜態儲存方式和動態儲存方式。靜態 由系統分配固定的儲存空間,全域性變數就儲存在靜態儲存區。動態 系統根據需要進行動態的分配儲存空間。在動態儲存區存放一下資料 1 函式形式引數 2 自動變數 未加 static 宣告 3 函式呼叫時的現場保護和返...