堆疊是個特殊的儲存區,屬於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 注意它與資料結構中的堆是兩回事,分配方式倒是類...