- 相關(guān)推薦
C語言變量存儲類別和內(nèi)存四區(qū)
C語言是一門通用計算機編程語言,應(yīng)用廣泛。C語言的設(shè)計目標(biāo)是提供一種能以簡易的方式編譯、處理低級存儲器、產(chǎn)生少量的機器碼以及不需要任何運行環(huán)境支持便能運行的編程語言。下面我們一起來看看C語言變量存儲類別和內(nèi)存四區(qū)的介紹,歡迎大家閱讀!
C語言變量存儲類別和內(nèi)存四區(qū)
變量存儲類別
變量聲明/定義的一般形式:
存儲類別 數(shù)據(jù)類型 變量名
存儲類別指的是數(shù)據(jù)在內(nèi)存中存儲的方法。存儲方法分為靜態(tài)存儲和動態(tài)存儲兩大類。標(biāo)準(zhǔn)C語言為變量、常量和函數(shù)定義了4種存儲類型:extern、auto、static、register。根據(jù)變量的存儲類別,可以知道變量的作用域和存儲期。這4種存儲類型可分為兩種生存期限:永久的(在整個程序執(zhí)行期都存在)和臨時的(暫時保存在堆棧和寄存器中)。extern和static用來標(biāo)識永久生存期限的“變量和函數(shù)”,而anto和register用來標(biāo)識臨時生存期限的"變量"。只有變量才有臨時生存期限。一個變量和函數(shù)只能具有一個存儲類型,也只能有一種生存期限。
內(nèi)存中供用戶使用的空間有三部分:
程序區(qū):存放程序的可執(zhí)行代碼;
靜態(tài)存儲區(qū):存放靜態(tài)變量(全局變量和靜態(tài)局部變量);
動態(tài)存儲區(qū):存放函數(shù)調(diào)用時調(diào)用函數(shù)的現(xiàn)場保護和返回地址、函數(shù)形參、自動局部變量;
變量的聲明分為”定義性聲明“(需建立存儲空間,如:int a;)和”引用性聲明“(不需建立存儲空間,如extern a;)。廣義上講,聲明包括定義,一般為敘述方便,把建立存儲空間的聲明稱定義,而不不需建立存儲空間的聲明稱聲明。
auto
函數(shù)中的局部變量,如果不用關(guān)鍵字static加以聲明,編譯系統(tǒng)對它們是動態(tài)地分配存儲空間的。函數(shù)的形參和在函數(shù)中定義的變量(包括在復(fù)合語句中定義的變量)都屬此類。在調(diào)用該函數(shù)時,系統(tǒng)給形參和函數(shù)中定義的變量分配存儲空間,數(shù)據(jù)存儲在動態(tài)存儲區(qū)中。在函數(shù)調(diào)用結(jié)束時就自動釋放這些空間。如果是在復(fù)合語句中定義的變量,則在變量定義時分配存儲空間,在復(fù)合語句結(jié)束時自動釋放空間。因此這類局部變量稱為自動變量(auto variable)。自動變量用關(guān)鍵字auto作存儲類別的聲明。
對自動變量賦初值,不是在編譯時進行的,而是在函數(shù)調(diào)用時進行。對自動變量來說,若不賦初值,則它的值是一個不確定的值。
int Fun(int a)
{
auto int b, c=3; //定義b和c為整型的自動變量,auto可省略
b = c + a; return b;
}
register
一般情況下,變量的值是存放在內(nèi)存中的。當(dāng)程序中用到哪一個變量的值時,由控制器發(fā)出指令將內(nèi)存中該變量的值送到CPU中的運算器。經(jīng)過運算器進行運算,如果需要存數(shù),再從運算器將數(shù)據(jù)送到內(nèi)存存放。為提高執(zhí)行效率,C++允許將局部變量的值放在CPU中的寄存器中,需要用時直接從寄存器取出參加運算,不必再到內(nèi)存中去存取。這種變量叫做寄存器變量,用關(guān)鍵字register作聲明。寄存器變量的分配方式是動態(tài)分配的。
由于CPU中的通用寄存器數(shù)目有限,通常只把少數(shù)使用頻繁的變量定義為寄存器變量。對超出寄存器數(shù)目的寄存器變量作一般自動變量處理。
只有局部自動變量和形式參數(shù)可作為寄存器變量,其他(如全局變量、局部靜態(tài)變量等)不行。在程序中定義寄存器變量對編譯系統(tǒng)只是建議性(而不是強制性)的。當(dāng)今的優(yōu)化編譯系統(tǒng)能夠識別使用頻繁的變量,自動地將這些變量放在寄存器中。
extern
全局變量(外部變量)是在函數(shù)的外部定義的,它的作用域為從變量的定義處開始,到本程序文件的末尾。在此作用域內(nèi),全局變量可以為本文件中各個函數(shù)所引用。編譯時將全局變量分配在靜態(tài)存儲區(qū)。有時需要用extern來聲明全局變量,以擴展全局變量的作用域。
1) 在一個文件內(nèi)聲明全局變量
如果外部變量不在文件的開頭定義,其有效的作用范圍只限于定義處到文件終了。如果在定義點之前的函數(shù)想引用該全局變量,則應(yīng)該在引用之前用關(guān)鍵字extern對該變量作外部變量聲明,表示該變量是一個將在下面定義的全局變量。有了此聲明,就可以從聲明處起,合法地引用該全局變量,這種聲明稱為提前引用聲明。
用extern聲明外部變量時,類型名可寫可不寫。例如," extern int A , B ; " 也可寫成 " extern A , B ; "。
2) 在多文件的程序中聲明外部變量
如果一個程序包含兩個文件,在兩個文件中都要用到同一個外部變量num,不能分別在兩個文件中各自定義一個外部變量num。正確的做法是:在任一個文件中定義外部變量num,而在另一文件中用extern對num作外部變量聲明,即 " extern int num " 或 " extern num ";編譯系統(tǒng)由此知道num是一個已在別處定義的外部變量,它先在本文件中找有無外部變量num,如果有,則將其作用域擴展到本行開始,如果本文件中無此外部變量,則在程序連接時從其他文件中找有無外部變量num,如果有,則把在另一文件中定義的外部變量num的作用域擴展到本文件,在本文件中可以合法地引用該外部變量num。
static
所有全局變量和用關(guān)鍵字static作存儲類型說明的局部變量稱為靜態(tài)變量。靜態(tài)變量存放在靜態(tài)存儲區(qū),一旦為其分配了存儲單元,它們在整個程序執(zhí)行期間將固定地占用這些存儲單元。若非必要,不要多用靜態(tài)局部變量。
對全局變量,static使其局部化(局部于本文件),靜態(tài)全局變量僅能為本源文件中各函數(shù)使用,不能為本源文件以外的其他源文件使用。
對局部變量,static使其由動態(tài)存儲變?yōu)殪o態(tài)存儲,靜態(tài)局部變量僅能為本函數(shù)使用,其他函數(shù)不能使用和影響它們。靜態(tài)局部變量是在編譯時賦初值的,且只賦初值一次。如在定義局部變量時不賦初值的話,則對靜態(tài)局部變量來說,編譯時自動賦初值0(對數(shù)值型變量)或空字符(對字符變量)。
注:
內(nèi)部函數(shù)也稱靜態(tài)函數(shù),不能被其他文件中的函數(shù)使用。定義內(nèi)部函數(shù)時,在函數(shù)名和函數(shù)類型的前面加static即可。
在C語言中,函數(shù)前如果無關(guān)鍵字extern,隱含其為外部函數(shù)。若需在其他文件的函數(shù)中調(diào)用此外部函數(shù),只需在調(diào)用的`文件中用extern聲明該外部函數(shù)。
內(nèi)存四區(qū)
棧區(qū)(stack)
由編譯器自動分配釋放,存放函數(shù)的參數(shù)值、局部變量的值等;其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。
堆區(qū)(heap)
一般由程序員分配釋放(動態(tài)內(nèi)存申請與釋放),若程序員不釋放,程序結(jié)束時可能由操作系統(tǒng)回收。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式倒是類似于鏈表。
全局區(qū)/靜態(tài)區(qū)(static)
全局變量和靜態(tài)變量的存儲是放在一起的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域,該區(qū)域在程序結(jié)束后由操作系統(tǒng)釋放;
常量區(qū):字符串常量和其他常量的存儲位置,程序結(jié)束后由操作系統(tǒng)釋放。
程序代碼區(qū)(code)
存放函數(shù)的二進制代碼。
函數(shù)調(diào)用模型必須和程序四內(nèi)存區(qū)綜合起來考慮:
主調(diào)函數(shù)分配的內(nèi)存(棧區(qū)、堆區(qū)、全局區(qū))都可以在被調(diào)用函數(shù)中使用;
被調(diào)用函數(shù)中分配的內(nèi)存,要分情況:在棧區(qū)中分配的內(nèi)存,在主調(diào)函數(shù)中是不能使用的;
【C語言變量存儲類別和內(nèi)存四區(qū)】相關(guān)文章:
C語言變量存儲布局07-05
C語言中變量儲存的類別07-24
C/C++變量在內(nèi)存中的分布05-03
C語言局部變量和全局變量06-25
C語言變量定義07-29
C語言變量理解07-28
C語言變量的類型10-30
C語言變量的使用10-12