變數在記憶體中的儲存

2021-07-10 23:11:33 字數 2004 閱讀 6454

c++中變數在記憶體中的儲存

一、記憶體大致可以分為三部分:**區、堆疊區、靜態資料段。c和c++中有全域性變數,靜態變數以及區域性變數等幾類。全域性變數和靜態變數是在編譯的時候就已經分配好在資料段,也就是說在執行main函式之前就已經分配好了位址,如果定義的時候已經初始化,那麼就存放初始化的值,如果沒有初始化,則由編譯器初始化為0。這就說明在整個程式的執行過程中全域性變數和靜態變數的位址和型別不會發生變化,可能變化的只是他的值。對於動態變數,則在編譯的階段並不分配記憶體,而是執行到相應的**段時再分配記憶體。區域性變數共有以下幾種:

1 int main(void)

}2 void fun()

3 void fun(int a,int b)//形式引數

編譯器對區域性變數的處理是放入棧中,出棧和入棧操作的運算元都是跟著指令存在於**段內的,當函式執行到區域性變數處,進行入棧操作,給他分配棧中的記憶體,供其它操作訪問。在使用結束後再出棧。所以,區域性變數的生存期是從定義的地方到該函式結束和**段結束。

二、在c++中,記憶體管理是一件十分讓人畏懼的事,要考慮的方面和情況很多,我認為關鍵的一點是要知道你的這個記憶體是屬於什麼分割槽中。在c++中程式在執行過程中分為:棧,堆,常量資料區,自由儲存區,全域性/靜態儲存區,這些區的管理還是有些區別的。

在棧中分配的變數主要是:引數,函式內定義的區域性變數,由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。

堆:主要是用new操作符來定義的申請的記憶體空間,不是在編譯器來管理分配,而是有程式自身來管理申請與銷毀。通常是用delete來刪除釋放記憶體空間。

常量資料區:存放程式定義的一些常量。常量在理論上是不讓改變的。

自由儲存區:就是那些由malloc等分配的記憶體塊,他和堆是十分相似的,不過它是用free來結束自己的生命的。

全域性/靜態儲存區:存放全域性變數及定義的靜態變數。

示例:

#includeusing namespace std;

char * getvalues()

char * getvalues_2()

char * getvalues_3()

char * getvalues_4()

int main()

結果為:

測試棧變數

*rc =7 rc values =7guiopkl

測試常量

*rc2 = q rc2 values =qwert

修改常量資料區中的值

*rc2 = 1 rc2 values =1234

測試區域性靜態變數

*rc3 = i rc3 values =ihnmbv

修改靜態區域性變數

*rc3 = q rc3 values =qaws

測試區域性堆變數

*rc4 = a rc4 values =asdfgh

請按任意鍵繼續. . .

(1)變數ach定義在區域性函式中,所以是區域性變數。區域性變數儲存在棧中,即在棧中開闢一塊記憶體(首位址為ach)用來存放字串。當區域性函式被呼叫時,區域性變數ach入棧,當區域性函式結束時出棧,該塊記憶體被釋放。函式返回該塊棧記憶體的首位址,由於該位址和新的變數rc繫結,所以返回的位址只指向字串的第乙個字元,後面的記憶體都釋放掉了。所以*rc是'7',rc是亂碼了。

(2)在區域性函式getvalues_2()中,ach是乙個區域性指標變數,即在棧記憶體中開闢乙個大小為4byte的空間存放指標,字串"qwert"存放在常量資料區,函式返回棧中存放的位址,這個位址指向常量資料區的中的資料,因此可以解引用。

(3)ach是乙個靜態指標,它在main之前就分配好了記憶體(全域性/靜態儲存區),static的值是可以改變的。

(4)ach是存放在棧中的指標,它指向對記憶體中的一塊區域。

變數在記憶體中的儲存

package com.gxlq.ren 該類表示荊楚的老師 public class jcteacher public void playgame 8種基本型別 整數,小數,布林型別,char 字元型別 n 復合 整數 byte 1 short 2 int 4 long 8 小數 float 4 ...

PHP變數在記憶體中的儲存方式

每門計算機語言都需要一些容器來儲存變數資料。在一些語言當中,變數都有特定的型別,如字串,陣列,物件等等。比如c和pascal就屬於這種。而php則沒有這樣的型別。在php中,乙個變數在某一行是字串,可能到下一行就變成了數字。變數可以經常在不同的型別間輕易的轉化,甚至是自動的轉 換。php之所以成為乙...

變數和值在記憶體中的儲存位置

變數和值在記憶體中的儲存位置 一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結...