轉組第8天 變數在記憶體中的位置和訪問方式

2022-08-24 11:24:12 字數 1219 閱讀 1801

2018-05-05

《c++反彙編和逆向技術》第七章  變數在記憶體中的位置和訪問方式 讀書筆記

1.全域性變數和區域性變數的區別

全域性變數屬於程序作用域,也就是說,在整個程序中都能夠訪問到這個全域性變數。靜態變數屬於檔案作用域,在當前原始碼檔案內可以訪問到;區域性變數屬於函式作用域,在函式內部可以訪問到;在「{}」語句塊內定義的變數,屬於塊作用域,只能在定義變數的「{}"快內訪問到。

全域性變數在記憶體中的地支順序是先定義的變數在低位址,後定義的變數在高位址。

全域性變數的特徵如下:

* 所在位址為資料區,生命週期與所在模組一致;

* 使用立即數間接訪問。//[g_nvar]

區域性變數的特徵如下:

* 所在位址為棧區,生命週期與所在的函式作用域一致;

* 使用ebp或esp間接訪問。

2. 區域性靜態變數的工作方式

靜態變數分為全域性靜態變數和區域性靜態變數,全域性靜態變數和全域性變數類似,只是全域性靜態變數只能在本檔案內使用。但這只是在編譯之前的語法檢查過程中,對訪問外部的全域性靜態變數做出的限制。全域性靜態變數的生命週期和全域性變數也是一樣的,而且在反彙編**中它們也無二樣。

區域性靜態變數比較特殊,它不會隨作用域的結束而消失,並且在未進入作用域之前就已經存在,其生命週期也和全域性變數相同。區域性靜態常量會被預先被作為全域性變數處理,而它的初始化部分只是在做賦值操作而已。

區域性靜態變數只初始化一次,因為其有乙個標誌位,如果為0則賦值初始化,否則賦值。標誌位大小為1個位元組,可以表示8個區域性靜態變數的狀態。

如果初始化的數值為常量,即多次初始化也不會產生變化,編譯器就直接採用全域性變數方式處理,優化了**,提公升了效率。為了使其不超出作用域訪問,使用名稱粉碎法,在編譯期將靜態變數重新命名,在原有名稱中加入其所在作用域以及型別等資訊。

3. 堆變數

malloc與new實現堆空間的申請。

free與delete完成對空間釋放。

堆空間的分配類似於商場中的商鋪管理,malloc是從商場的空地中劃分出一塊作為商鋪,而new則可以將劃分好的商鋪直接租用。由於malloc缺少商鋪的營業範圍規定,因此需要將申請好的堆強制轉換以說明其型別方可使用,而new則無需這種操作,直接可以使用。

在對資料末尾也加入了0xfdfdfdfd,這是向下越界的檢查標誌,這是程式編譯方式為debug版的重要特徵之一。

各變數在記憶體中的位置

在linux中寫乙個程式,裡面全域性變數,區域性變數,static,const,常數,陣列,輸出這些變數的位址 包括賦值的和沒有賦值的,各類資料型別 include int a int b 1 int const c 2 static int d static int e 3 char src1 2...

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

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

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

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