1. 程式人生 > >程式中各變數在記憶體中的位置

程式中各變數在記憶體中的位置

主要給初學者介紹下,我們編寫的程式中,我們的程式碼,全域性變數和靜態變數在記憶體中是怎麼存放的,我們new或者malloc出來的變數,在記憶體中是怎麼分配的,


全域性變數,靜態變數----存於資料區;

區域性變數,函式形參----存於stack;

函式程式碼----------------存於程式碼區;

new出來的變數--------存於heap。

堆和棧的區別:
一、預備知識——程式的記憶體分配
一個由C/C++編譯的程式佔用的記憶體分為以下幾個部分:
1、棧區(stack)——由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。 
2、堆區(heap)—— 一般由程式設計師分配(如new、malloc)和釋放(delete,free), 若程式設計師不釋放,程式結束時可能由OS回收,但這樣會導致記憶體洩露,嚴重的導致系統崩潰, 如一個程式是長期執行的,申請的變數永遠都得不到釋放,系統記憶體會耗盡。注意它與資料結構中的堆是兩回事,分配方式倒是類似於連結串列。


3、全域性區(靜態區)(static)——全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。 程式結束後由系統釋放。 
4、文字常量區 —— 常量字串就是放在這裡的。 程式結束後由系統釋放 。 
5、程式程式碼區 —— 存放函式體的二進位制程式碼。 

堆區就就是就是存放new出來的變數的