C C 程式的記憶體分布

2021-06-16 05:37:58 字數 929 閱讀 9652

理解c/c++程式中的記憶體分布,可以幫助我們減少程式設計時犯常見的錯誤,如將指向區域性變數的位址返回等。在c/c++中,通常可以把記憶體理解成4個分割槽:棧、堆、全域性/靜態儲存區和常量儲存區。

(1)棧:通常是用於那些在編譯期間就能確定儲存大小的變數的儲存區,用於在函式作用域內(塊作用域)建立、在離開作用域後自動銷毀的變數的儲存區。通常是區域性變數、函式引數等的儲存區。它的儲存空間是連續的,兩個緊挨著定義的區域性變數,他們的儲存空間也是緊挨著的。棧的大小通常是有限制的,如visual c++編譯器預設棧的大小是1m;而在unix-like系統中,程式執行的棧的大小不能由編譯器(如gcc)來控制,而是由環境變數來設定的。linux中一般預設為10mb。

(2)堆:通常是用於那些在編譯期間不能確定儲存大小的變數的儲存區,它的儲存空間是不連續的,一般由malloc(或new)函式來分配記憶體塊,並且需要用free(delete)函式來釋放記憶體。如果程式設計師沒有將它釋放,則會出現常說的記憶體洩漏問題。需要注意的是,兩個緊挨著定義的指標變數,所指向的malloc出來的兩塊記憶體並不一定是緊挨著的。另外需要注意的一點是,堆的大小幾乎是不受限制的,在乙個位址線為32位的作業系統上,理論上每個程式的可定址空間是4gb。

(3)全域性/靜態儲存區:和「棧」類似,通常是用於那些在編譯期間就能確定儲存大小的變數的儲存區,但它用於的是在整個程式執行期間都可見的全域性變數和靜態變數。如在函式體中用關鍵字static定義的變數。

(4)常量儲存區:和「全域性/靜態儲存區」類似,通常是用於那些在編譯期間就能確定儲存大小的常量的儲存區,並且在程式執行期間,儲存區內的常量也是全域性可見的。這是一塊比較特殊的儲存區,在它裡面存放的是常量,不允許被修改。如字串常量就是存在該記憶體區域內。

通常,變數識別符號的的意義在於它給一塊記憶體儲存區提供了名字,以方便程式對這塊記憶體進行讀寫。左值和右值是c/c++中乙個重要的概念,簡單的理解,左值是記憶體儲存區的名字,右值是存放在儲存區中的值。

--斌哥整理編輯

C C 程式啟動後記憶體分布

1 從低位址開始,依次是 區,資料區 包含靜態資料區 常量資料區 堆 自下向上生長 動態庫的檔案對映 棧 3 不同執行緒的棧有一定的間距,基本等同於執行緒棧的限制大小,執行緒切換前會儲存當前執行緒的棧頂,這樣當再次切換回來時,可以從棧頂向下分配 4 程式的有些記憶體之存在虛擬位址空間,如果實際沒有使...

c c 程式編譯後的記憶體分布

乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類...

C C 的記憶體分布

說明 1 棧又叫堆疊,非靜態區域性變數 函式引數 返回值等等,棧是向下增長的。2 記憶體對映段是高效的i o對映方式,用於裝載乙個共享的動態記憶體庫。使用者可使用系統介面建立共享共 享記憶體,做程序間通訊。3 堆用於程式執行時動態記憶體分配,堆是可以上增長的。4 資料段 儲存全域性資料和靜態資料。5...