程式執行堆疊

2021-09-11 11:37:53 字數 810 閱讀 6169

堆疊是個特殊的儲存區,屬於ram空間的一部分

堆疊用於函式呼叫、中斷切換時保護和恢復現場資料

堆疊中的物體具有乙個特徵:第乙個放入堆疊中的總是最後被拿出來

堆疊中定義了一些操作,兩個重要的是push和pop

push入棧:堆疊指標sp加1,然後在堆疊的頂部加入乙個元素

pop出棧:先將sp所指示的內部ram單元中內容送入直接位址定址的單元中

然後再將堆疊指標sp減1    

這兩種操作實現了資料項的插入和刪除

堆疊空間分配

堆:由作業系統自動分配釋放,存放函式的引數,區域性變數等

堆:由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由操作

申請響應:

棧:只要棧的剩餘空間大於所申請空間,系統將為程式提供記憶體,否則將報異常提示棧溢位

堆:首先應該知道作業系統有乙個記錄空閒記憶體位址的鍊錶,當程式收到程式的申請時

會遍歷該鍊錶,尋找第乙個空間大於所申請空間的堆節點

然後將該節點從空閒節點鍊錶刪除,並將該節點的空間分配給程式

會在這塊記憶體空間中的首位址處記錄本次分配的大小,這樣,**中的deliete語句才能正確的釋放記憶體空間

另外,由於找到的堆節點的大小不一定正好等於申請的大小,系統會自動將多餘的那部分重新放入空閒鍊錶中

儲存內容:

棧:在函式呼叫時,引數時從右往左入棧的,然後是函式中的區域性變數

靜態變數是不入棧的

本次函式呼叫結束後,區域性變數先出棧,然後是引數,最後棧頂指標指向函式的返回位址,也就是主函式下一條指令的位址,程式由該點繼續執行

堆:一般是在堆的頭部用乙個位元組存放堆的大小

程式記憶體分配 堆疊

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

windows程式堆疊分布

引數 返回位址 區域性變數和ebp的關係 debug版本 0x004000d0 local 3 ebp 20 區域性變數3 0xcccccccc 0xcccccccc 0x004000dc local 2 ebp 14 區域性變數2 0xcccccccc 0xcccccccc 0x004000e8 ...

程式分配堆疊全域性區

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