C C 中的變數儲存類別以及記憶體分配

2021-07-25 22:01:37 字數 2442 閱讀 4154

1. 變數的儲存類別

從變數值存在的角度來分,可以分為靜態儲存方式和動態儲存方式。所謂靜態儲存方式指在程式執行期間由系統分配固定的儲存空間的方式(程式開始執行時分配,在程式完畢時釋放,在程式過程中它們佔據國定的儲存單元,而不是動態分配和釋放)。而動態儲存方式在執行期間根據需要進行動態儲存方式(在程式過程中申請和釋放的一些空間)。記憶體中供使用者使用的儲存空間分為:程式區、靜態儲存區和動態儲存區。程式放在程式區,資料放在靜態儲存區和動態儲存區。在動態儲存區存放函式形式引數、自動變數(未加static宣告的區域性變數)和函式呼叫時的現場保護和返回位址。

在c語言中每乙個變數和函式兩個屬性:資料型別和資料的儲存類別。儲存方式分為兩大類:靜態儲存和動態儲存。具體保護:自動的(auto)、靜態的(static)、暫存器的(register)、外部的(extern)。下面分別對上面關鍵字進行說明。

(1)auto:這個關鍵字是預設的,這個關鍵字屬於動態儲存區,宣告時不進行預設初始化。

(2)static:如果希望區域性變數呼叫結束後不消失保留此值(即加上改關鍵字在靜態區分配空間儲存),有預設初值。靜態區域性變數在編譯時賦初值(即賦初值一次),以後每次執行保留上次的結果。如果是全域性變數加上static時,就表示該變數的作用域只限於本模組。(全域性變數預設儲存在靜態儲存區)。同樣,在多檔案中為了防止名字衝突也可以將函式宣告為static,這樣只在檔案內部引用

(3)register:一般情況下變數時存在記憶體中,程式用到變數時發出指令將記憶體中的該變數送到運算器中,經過運算,再儲存到內種。這樣如果頻繁的使用某變數就將其定義為register型別(自由區域性自動變數和函式形式引數),直接放在cpu中,提高效率。(一般的編譯器為使用者考慮這個問題,一般不需要考慮)

(4)extern:用來宣告外部變數和外部函式(和static一種用法相對),extern只是宣告而不是定義。兩種情況:同一檔案中宣告extern(表示變數定義在當前引用的後面);多檔案中宣告外部變數(表示該變數定義在檔案外部)。函式宣告也是如此(一般情況函式宣告都沒有extern,省略的)。

注:類具有封裝性,所以類中的成員均不能使用關鍵字extern、auto或register限定其儲存型別。

2. c語言記憶體分配機制

(1)棧(stack):位於函式內的區域性變數(包括函式實參),由編譯器負責分配釋放,函式結束,棧變數失效。

(2)堆(heap):由程式設計師用malloc/calloc/realloc分配,free釋放。如果程式設計師忘記free了,則會造成記憶體洩露,程式結束時該片記憶體會由os**,但程式只要不結束,就有可能造成記憶體洩露。(程式設計師負責分配和釋放)

(3)全域性區/靜態區(global static area): 全域性變數和靜態變數存放區,程式一經編譯好,該區域便存在。並且在c語言中初始化的全域性變數和靜態變數和未初始化的放在相鄰的兩個區域(在c++中,由於全域性變數和靜態變數編譯器會給這些變數自動初始化賦值,所以沒有區分了)。由於全域性變數一直佔據記憶體空間且不易維護,推薦少用。程式結束時釋放。

(4)c風格字串常量儲存區: 專門存放字串常量的地方,程式結束時釋放。

(5)程式**區:存放程式二進位制**的區域。

例項1:

int a = 0; //全域性初始化區 

char *p1; //全域性未初始化區(c++中則初始化為null)

int main()

3. c++語言記憶體分配機制

在c++語言中,與c類似,不過也有所不同,記憶體主要分為如下5個儲存區:

(1)棧(stack):位於函式內的區域性變數(包括函式實參),由編譯器負責分配釋放,函式結束,棧變數失效。

(2)堆(heap):這裡與c不同的是,該堆是由new申請的記憶體,由delete或delete負責釋放。

(3)自由儲存區(free storage):由程式設計師用malloc/calloc/realloc分配,free釋放。如果程式設計師忘記free了,則會造成記憶體洩露,程式結束時該片記憶體會由os**。

(4)全域性區/靜態區(global static area): 全域性變數和靜態變數存放區,程式一經編譯好,該區域便存在。在c++中,由於全域性變數和靜態變數編譯器會給這些變數自動初始化賦值,所以沒有區分了初始化變數和未初始化變數了。需要說明一點,全域性靜態變數和區域性靜態變數都是儲存在同乙個靜態區(全域性區),只是作用域不同。

(5)常量儲存區: 這是一塊比較特殊的儲存區,專門儲存不能修改的常量(一般是const修飾的變數,或是一些常量字串)。

C C 中的儲存類別

c提供了多種不同的模型或儲存類別 storage class 在記憶體中儲存數 據。要理解這些儲存類別,先要複習一些概念和術語。本書目前所有程式設計示例中使用的資料都儲存在記憶體中。從硬體方面來 看,被儲存的每個值都占用一定的物理記憶體,c 語言把這樣的一塊記憶體稱為 物件 object 物件可以儲...

變數的儲存類別

從變數的作用域來分,變數可以分為全域性變數和區域性變數。在乙個函式內部定義的變數是區域性變數,它只是在本函式範圍內有效,在此函式外不能使用這些變數的。全域性變數可以供所有函式共用,它的有效範圍為從定義變數的位置開始到本原始檔結束。全域性變數的優點是 可以減少函式實參和形參的個數,從而減少記憶體空間以...

變數的儲存類別

儲存類別 是指資料在記憶體中的儲存方式 1 供使用者使用的儲存空間 程式區靜態儲存區 編譯時候分配空間,程式結束釋放空間。存放全域性變數 動態儲存區 定義時動態分配空間,對應函式完成時就釋放空間,再呼叫時又重新動態分配空間。存放auto型別區域性變數 2 儲存型別 auto,static,regis...