程序的局部變量 全局變量 動態申請數據分別存儲在什麼地方?

程序的局部變量 全局變量 動態申請數據分別存儲在什麼地方?程序員


一、棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數名,局部變量的名等。其操做方式相似於數據結構中的棧。數據結構

二、堆區(heap)— 由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收。注意它與數據結構中的堆是兩回事,分配方式卻是相似於鏈表函數

三、靜態區(static)—全局變量和局部靜態變量的存儲是放在一塊的。程序結束後由系統釋放。性能

四、文字常量區—常量字符串就是放在這裏的,程序結束後由系統釋放 。spa

五、程序代碼區— 存放函數體二進制代碼htm





量的類別:
根據做用域可分爲全局變量和局部變量。
根據生存週期可分爲靜態存儲方式和動態存儲方式,具體地又分爲自動的(auto)、靜態的(static)、寄存器的(register)、外部的(extern)。
靜態存儲方式是指在程序運行期間分配固定的存儲空間的方式,動態存儲方式是在程序運行期間根據須要進行動態的分配存儲空間的方式。

每個變量均有做用域和存儲類別兩個屬性,這些屬性共同用於描述一個變量,這些不一樣類型的變量與存儲位置的關係以下:
外部變量(全局變量)、靜態外部變量、靜態局部變量存儲在靜態存儲區。
自動局部變量(局部變量默認爲自動局部變量)、函數形參存儲在動態存儲區,不管是靜態存儲區仍是動態存儲區均屬於內存中的用戶區。
可是,寄存器變量是存儲在CPU寄存器中的而不是內存中。

首先說明一下與做用域相關的幾個屬性:
局部變量:在一個函數內部定義的變量是內部變量,它只在本函數範圍內有效,也就是說只有在本函數內才能使用它們,在此函數之外是不能使用這些變量的,這種類型的變量就稱爲「局部變量」。
全局變量:在函數外定義的變量,能夠爲本源文件中其它函數所公用,有效範圍爲從定義變量的位置開始到本源文件結束,這種類型的變量就稱爲「全局變量」。

接下來講明一下與存儲類型相關的幾個屬性:
atuo:在聲明局部變量時,若不指定 static,默認均是 auto,這類變量都是動態分配存儲空間的,數據存儲在動態存儲區中。
static:在聲明局部變量時,使用關鍵字 static 將局部變量指定爲「靜態局部變量」,這樣在函數調用結束後不消失而保留原值,即佔用的存儲單元不釋放,在下一次函數調用時,該變量已有值就是上次函數調用結束時的值。
register:在聲明動態局部變量或者函數形參時,可將變量聲明爲register,這樣編譯系統就會爲變量分配一個寄存器而不是內存空間,經過這種方式可提高對某些局部變量頻繁調用的程序的性能。(寄存器運算速度遠高於內存)
extern:用於擴展全局變量的做用域,好比若是函數想引用一個外部變量,但該外部變量在該函數後定義,那麼這個函數須要使用 extern 來聲明變量,這樣才能使用在該函數後面定義的全局變量。此外,extern 還能夠在多文件的程序中聲明外部變量。內存

相關文章
相關標籤/搜索