程式程式碼,常量,區域性變數,全域性變數在記憶體中的儲存位置
全域性變數、靜態區域性變數儲存在全域性資料區,初始化的和未初始化的分別儲存在一起;
普通區域性變數儲存在堆疊中;
全域性變數和區域性變數在記憶體裡的區別?
一、預備知識—程式的記憶體分配
一個由c/C++編譯的程式佔用的記憶體分為以下幾個部分
1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。
2、堆區(heap) — 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由OS回收 。注意它與資料結構中的堆是兩回事,分配方式倒是類似於連結串列,呵呵。
3、全域性區(靜態區)(static)—,全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。 - 程式結束後有系統釋放
4、文字常量區 —常量字串就是放在這裡的。 程式結束後由系統釋放
5、程式程式碼區—存放函式體的二進位制程式碼。
二、例子程式
這是一個前輩寫的,非常詳細
//main.cpp
int a = 0; 全域性初始化區
char *p1; 全域性未初始化區
main()
{
int b;// 棧
char s[] = "abc"; //棧
char *p2; //棧
char *p3 = "123456"; 123456\0";//在常量區,p3在棧上。
static int c =0; //全域性(靜態)初始化區
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
//分配得來得10和20位元組的區域就在堆區。
strcpy(p1, "123456"); //123456\0放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一個地方。
}
相關文章
- 全域性變數與區域性變數變數
- 區域性變數和全域性變數變數
- javascript中的作用域(全域性變數和區域性變數)JavaScript變數
- C語言區域性變數、全域性變數、靜態區域性變數、靜態全域性變數C語言變數
- Python中的全域性變數和區域性變數Python變數
- 記憶體分配知識(全域性,區域性,靜態變數)記憶體變數
- Java區域性變數與全域性變數Java變數
- java 全域性變數和區域性變數Java變數
- JavaScript —— 區域性變數和全域性變數JavaScript變數
- jmeter全域性變數和區域性變數JMeter變數
- 【c】全域性變數與區域性變數變數
- python全域性變數與區域性變數Python變數
- 記一個全域性變數"冒充"區域性變數引起的bug變數
- js-js的全域性變數和區域性變數JS變數
- JavaScript五:全域性變數&區域性變數;運算子JavaScript變數
- python全域性變數和區域性變數, globalPython變數
- Android中全域性變數與區域性變數的使用總結Android變數
- iOS 靜變數static、全域性變數extern、區域性變數、例項變數iOS變數
- Python的區域性變數和全域性變數使用解惑Python變數
- Python全域性變數與區域性變數詳解Python變數
- 詳解python 區域性變數與全域性變數Python變數
- Python的全域性和區域性變數Python變數
- 成員變數、全域性變數、例項變數、類變數、靜態變數和區域性變數的區別變數
- iOS全域性變數與屬性的記憶體管理iOS變數記憶體
- 區域性變數和全域性變數(靜態和非靜態)區別變數
- angular中定義全域性變數及全域性變數的使用Angular變數
- 多執行緒中,區域性變數與全域性變數哪個比較安全?執行緒變數
- 靜態全域性變數和全域性變數變數
- [Python學習] 專題六.區域性變數、全域性變數global、匯入模組變數Python變數
- 十二、變數作用域:區域性變數、全域性變數,函式版名片管理系統—新增函式文件變數函式
- 全域性變數和靜態變數的區別變數
- Python中類變數、成員變數、區域性變數的區別Python變數
- 全域性變數變數
- 2、全域性變數和列舉常量 (轉)變數
- 函式之定義及全域性變數&區域性變數&風溼理論函式變數
- 成員變數和區域性變數變數
- golang變數作用域問題-避免使用全域性變數Golang變數
- 成員變數和區域性變數的區別變數