1.棧區 (stack):(區域性變數,形參)
filo (先入後出),函式的形參和區域性變數,存放在這個區。由編譯器自動分配,自動釋放。
2.堆區(heap):(申請空間)
這個區,由程式設計師申請後使用,使用完了,需要手動釋放。否則,會造成記憶體洩漏。
一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os**。注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶
(申請空間的函式有:malloc --- free ; new --- delete )
3.全域性區(靜態區)(static):(全域性變數和靜態變數)
全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。
程式結束後由系統釋放。
4**.文字常量區:(存放常量)**
常量字串就是放在這裡的,直到程式結束後由系統釋放。
5.**區:
存放函式體的二進位制**
變數的作用域和生存期
一、從變數的作用域(即從空間)角度來分,可以分為全域性變數和區域性變數。從另乙個角度,從變數值存在的作時間(即生存期)角度來分,可以分為靜態儲存方式和動態儲存方式。
1.作用域(scope):起作用的**範圍
根據作用域不同,變數分為區域性變數和全域性變數
只有在變數的作用域範圍內才能訪問變數
不同作用域的區域性變數可以同名,不衝突
(1)區域性變數:
區域性變數也稱為內部變數,是在函式體中定義的變數(形參變數也是區域性變數),其作用域僅限於函式內,離開該函式後,訪問(使用)該變數是非法的。
(2)全域性變數:
全域性變數,它是在函式外部定義的變數。它不屬於哪乙個函式,它屬於乙個源程式檔案。其作用域是整個源程式。在函式中使用全域性變數,一般應作全域性變數說明。只有在函式內經過說明的全域性變數才能使用。全域性變數的說明符為extern。但在乙個函式之前定義的全域性變數,在該函式內使用可不再加以說明。 使用extern關鍵字宣告,可將其作用域進行擴充(本原始檔或其他原始檔)。
使用static關鍵字可以將其作用域限定在其所在原始檔,這樣就和其他原始檔中的同名全域性變數不衝突了
用static關鍵字定義的全域性變數稱為靜態全域性變數。
用extern關鍵字定義的全域性變數稱為外部變數
關於區域性變數的作用域還要說明以下幾點:
1) 主函式中定義的區域性變數也只能在主函式中使用,不能在其它函式中使用。同時,主函式中也不能使用其它函式中定義的變數。因為主函式也是乙個函式,它與其它函式是平行關係。這一點是與其它語言不同的,應予以注意。
2) 形參變數是屬於被調函式的區域性變數,實參變數是屬於主調函式的區域性變數。
3) 允許在不同的函式中使用相同的變數名,它們代表不同的物件,分配不同的單元,互不干擾,也不會發生混淆。
4) 在復合語句中也可定義變數,其作用域只在復合語句範圍內。
5)如果同乙個原始檔中,外部變數與區域性變數同名,則在區域性變數的作用範圍內,外部變數被「遮蔽」,即它不起作用。
main()
printf("%d\n",k);二、從另乙個角度,從變數值存在的作用時間(即生存期)角度來分,可以分為靜態儲存方式和動態儲存方式。
使用者儲存空間可以分為三個部分:
1) 程式區;
2) 靜態儲存區;
3) 動態儲存區;
靜態儲存區:
全域性變數全部存放在靜態儲存區,在程式開始執行時給全域性變數分配儲存空間,程式行完畢就釋放。在程式執行過程中它們佔據固定的儲存單元,而不動態地進行分配和釋放;(相對穩定不變,生存周期長)
動態儲存區存放以下資料:
1) 函式引數;
2) 自動變數(auto)(未加static宣告的區域性變數);
對以上這些資料,在函式開始呼叫時分配動態儲存空間,函式結束時釋放這些空間。
在c語言中,每個變數和函式有兩個屬性:資料型別和資料的儲存類別。
auto變數
函式中的區域性變數,如不專門宣告為static儲存類別,(預設)都是動態地分配儲存空間的,資料儲存在動態儲存區中。函式中的形參和在函式中定義的區域性變數(包括在復合語句中定義的變數),都屬此類,在呼叫該函式時系統會給它們分配儲存空間,在函式呼叫結束時就自動釋放這些儲存空間。這類區域性變數稱為自動變數。自動變數用關鍵字auto作儲存類別的宣告(或缺省)。
關鍵字auto可以省略,auto不寫則隱含定為「自動儲存類別」,屬於動態儲存方式。
用static宣告區域性變數
有時希望函式中的區域性變數的值在函式呼叫結束後不消失而保留原值,這時就應該指定區域性變數為「靜態區域性變數」,用關鍵字static進行宣告。
對靜態區域性變數的說明:
1) 靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元。在程式整個執行期間都不釋放。而自動變數(即動態區域性變數)屬於動態儲存類別,佔動態儲存空間,函式呼叫結束後立即釋放。
2) 靜態區域性變數在編譯時賦初值,即只賦初值一次;而對自動變數賦初值是在函式呼叫時進行,每呼叫一次函式重新給一次初值,相當於執行一次賦值語句。
3) 如果在定義區域性變數時不賦初值的話,則對靜態區域性變數來說,編譯時自動賦初值0(對數值型變數)或空字元(對字元變數)。而對自動變數來說,如果不賦初值則它的值是乙個不確定的值。
register變數(暫存器變數)
為了提高效率,c語言允許將區域性變數的值放在cpu中的暫存器中,這種變數叫「暫存器變數」,用關鍵字register作宣告。
說明:1) 只有區域性自動變數和形式引數可以作為暫存器變數;
2) 乙個計算機系統中的暫存器數目有限,不能定義任意多個暫存器變數;
3) 區域性靜態變數不能定義為暫存器變數。
用extern宣告外部變數
外部變數(即全域性變數的外部表現形式)是在函式的外部定義的。全域性變數的作用域為從變數定義處開始,到本程式檔案的末尾。extern對該變數作「外部變數宣告」。表示該變數是乙個已經定義的外部變數。有了此宣告,就可以從「宣告」處起,其他原始檔就可以合法地使用該外部變數。
用extern宣告外部變數,擴充套件程式檔案中變數的作用域。
auto :宣告自動變數 一般針對的是區域性變數,一般區域性變數預設就是這個
extern:宣告外部變數 一般針對的是全域性變數
static:宣告靜態變數 比區域性變數生存期長
register:宣告暫存器變數
對於經常使用的變數,若無特別說明,編譯器會優化,將變數資料放到暫存器中,以提高讀取效率。
volatile:宣告變數在程式執行中,可被隱含的改變(拒絕編譯器的優化)
告訴編譯器修飾的變數是隨時變化的,每次使用都必須從記憶體中去取出它的值。如果乙個暫存器或變數,表示乙個埠或者多個執行緒的共享資料,需要用volatile,保證對特殊位址的訪問。
變數如果加了volatile修飾,則會從記憶體中重新裝載內容,而不是直接從暫存器中拷貝內容。
const :宣告為常量。與volatile 對立。
C 五大記憶體分割槽及區別
c 五大記憶體分割槽及區別 一 五大記憶體分割槽 在c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清除的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。堆,就是那些由new分配的記憶體塊,他們的釋...
C 五大記憶體分割槽
c 五大記憶體分割槽 在c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用...
C 五大記憶體分割槽
五大記憶體分割槽 在c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧 就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。堆 就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式...