不同變數的儲存區域

2021-05-22 01:07:28 字數 928 閱讀 9138

記憶體分配方式有三種:

(1)  從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static 變數。

(2)  在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。

(3)  從堆上分配,亦稱動態記憶體分配。程式在執行的時候用 malloc 或 new 申請任意多少的記憶體,程式設計師自己負責在何時用 free 或 delete 釋放記憶體。動態記憶體的生存期由我們決定,使用非常靈活,但問題也最多。

全域性變數和區域性變數在記憶體裡的區別?堆和棧

一、預備知識—程式的記憶體分配

乙個由c/c++編譯的程式占用的記憶體分為以下幾個部分

1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。

2、堆區(heap) — 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os** 。注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶,呵呵。

3、全域性區(靜態區)(static)—,全域性變數和靜態變數(包括靜態區域性變數)的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。 - 程式結束後有系統釋放

4、文字常量區 —常量字串就是放在這裡的。 程式結束後由系統釋放

5、程式**區—存放函式體的二進位制**。

二、例子程式

//main.cpp 

inta =0

; 全域性初始化區 

char

*p1; 全域性未初始化區 

main() 

放在常量區,編譯器可能會將它與p3所指向的"123456"優化成乙個地方。 }

C C 變數儲存區域

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

Block 在不同情況下的變數儲存區域

一.如果只使用全域性或靜態變數或不使用外部變數,那麼block塊的 會儲存在全域性區 二.如果使用了外部變數,在arc中,block塊的 會儲存在堆區 在mrc中,block快的 會儲存在棧區 三.block預設情況下不能修改外部變數,只能讀取外部變數 在arc中,外部變數存在堆中,這個變數在blo...

關於變數儲存區域問題

在變數的生存作用域時,不妨這裡以c語言為所用語言吧 乙個函式內的區域性變數在函式執行完畢後會被銷毀。比如 不太會在csdn上排版 見諒 1 int func int main 如果main函式中沒有使用到func函式的返回值,那麼func中的a變數應該在func右 時就被銷毀,而main中使用到了,...