|
程序中,在數(shù)據(jù)聲明中定義的變量和數(shù)組,它們存儲在靜態(tài)存儲區(qū)或者動(dòng)態(tài)存儲區(qū),其空間由系統(tǒng)負(fù)責(zé)分配,最終也由系統(tǒng)負(fù)責(zé)回收,分配時(shí)機(jī)和回收時(shí)機(jī)用戶無法控制。另外,它們都有自己的名字(因?yàn)槎x時(shí)有命名),程序中可以通過變量名或數(shù)組名訪問它們。 而“動(dòng)態(tài)分配”的變量或數(shù)組,分配時(shí)機(jī)和釋放時(shí)機(jī)可完全由程序員自己決定。另外,“動(dòng)態(tài)分配”的空間,由于沒有數(shù)據(jù)分明,因此這部分空間沒有名字,無法像使用變量或數(shù)組那樣通過變更名或數(shù)組名引用其中的數(shù)據(jù),只能通過指針變量來訪問。 對于數(shù)據(jù)在內(nèi)存中的存儲,C語言提供了3種策略,即靜態(tài)分配、自動(dòng)分配(棧式分配)和動(dòng)態(tài)分配。 1 靜態(tài)分配:靜態(tài)分配由編譯器自動(dòng)分配和釋放,在編譯時(shí)就確定了運(yùn)行時(shí)變量在內(nèi)存中的位置。這種性質(zhì)允許變量在整個(gè)程序的運(yùn)行過程中都不消失。在C語言中使用關(guān)鍵字static來定義靜態(tài)變量(可以是靜態(tài)局部變量、靜態(tài)全局變量或者在所有函數(shù)外面定義的全局變量)。
2 自動(dòng)內(nèi)存分配(在棧上分配):自動(dòng)分配同樣也是由編譯器自動(dòng)分配和釋放,在編譯時(shí)并不確定變量在內(nèi)存中的位置,而是在調(diào)用函數(shù)時(shí)給變量分配空間,函數(shù)返回時(shí)釋放空間。C編譯器通過系統(tǒng)棧來管理這樣的變量。在C語言中,auto型變量是通過棧來管理的,不需要人為管理。
3 動(dòng)態(tài)內(nèi)存分配(在堆上分配):動(dòng)態(tài)分配是指在程序運(yùn)行過程中動(dòng)態(tài)申請內(nèi)存的方法。這樣的內(nèi)存空間是從一個(gè)叫做堆的空間申請的,申請的空間是一段連續(xù)的內(nèi)存空間。不需要該內(nèi)存空間時(shí),應(yīng)該人為釋放它,否則會(huì)導(dǎo)致內(nèi)存資源的浪費(fèi)。
C語言中malloc()大體的實(shí)現(xiàn)是,從操作系統(tǒng)一次性地取得比較大的內(nèi)存,然后將這些內(nèi)存“零售”給應(yīng)用程序。
(內(nèi)存分配中的堆和棧與數(shù)據(jù)結(jié)構(gòu)的堆和棧有本質(zhì)的區(qū)別。) C語言的變量有兩種屬性:數(shù)據(jù)類型和存儲類型。存儲類型標(biāo)識符有:auto,extern,static,register。用來說明變量在計(jì)算機(jī)中不同的存儲形態(tài),包括存儲位置、作用域和生存期。
函數(shù)調(diào)用時(shí),主調(diào)函數(shù)的實(shí)參是準(zhǔn)備好的具體數(shù)值,形參是函數(shù)調(diào)用時(shí)才開辟單元的變量。 在編寫程序時(shí),要告訴計(jì)算機(jī)這些數(shù)據(jù)的存儲位置。變量的存儲類型的功能之一就是確定該變量是存放在動(dòng)態(tài)數(shù)據(jù)區(qū)、靜態(tài)存放區(qū)還是寄存器中。
數(shù)據(jù)存儲涉及的內(nèi)容:
|
|
|