C語言之棧楨

2021-08-19 20:21:21 字數 800 閱讀 7963

一、記憶體分布

一般我們把程序的位址空間分為:棧區(heap)、堆區(stack)、未初始化靜態全域性區、已初始化靜態全域性區、字元常量區、**區。如圖:

二、棧幀的建立與撤銷

我們知道每一次函式呼叫的過程都要為函式開闢棧空間,用於本次函式呼叫中臨時變數的儲存,現場保護。這塊棧空間稱之為函式棧楨。每乙個函式都有自己的棧幀空間,並且獨佔自己的棧幀空間。

系統提供兩個特殊的暫存器用於標識棧楨的頂部和底部。

esp:棧指標暫存器(extended stack pointer),其內存放著乙個指標,該指標永遠指向系統棧最上面乙個棧幀的棧頂,即棧頂暫存器。      

ebp:基址指標暫存器(extended base pointer),即棧底暫存器

除了與棧相關的暫存器外,我們還需要記住另乙個至關重要的暫存器。eip:指令暫存器(extended instruction pointer),也稱程式計數器。其內存放著乙個指標,該指標永遠指向下一條等待執行的指令位址。      

首先棧是自高位址向低位址即向下生長的。我們通過如下程式了解棧幀建立過程:

int myadd(int _a, int _b)

int main()

c語言之棧結構

棧是一種只能在一端進行插入或者刪除操作的線性表 說明棧還是線性表結構,只是操作受限而已 其中允許進行插入或者刪除操作的一端稱為棧頂。棧的插入和刪除一般叫入棧和出棧。棧的順序儲存結構叫做順序棧,棧的鏈式儲存結構叫做鏈棧。define maxsize 100 typedef struct sqstack...

C語言筆記 函式的呼叫過程(棧楨)

堆和棧的理解 一 什麼是棧楨 2 棧幀表示程式的函式呼叫記錄,而棧幀又是記錄在棧上面,很明顯棧上保持了n個棧幀的實體,實際上我們這裡說的棧幀是軟體上的概念,據說有硬體概念,不是很了解 那就可以說棧幀將分割成了n個記錄塊,但是這些記錄塊大小不是固定不變的,因為棧不僅儲存諸如 函式入參,出參,返回位址和...

c語言之進製轉換(棧實現)

從上兩篇部落格中我們可以知道,棧具有後進先出的特性,而進製轉換的列印輸出剛好與計算過程相反,滿足棧這後進先出的特性,所以可以用棧很快的實現進製轉換,下面是用棧實現進製轉換的c函式 void conversion sqstack pstack,unsigned int n,const unsigned...