作者ggg12345 (ggg)
看板PLT
標題Re: [轉錄][閒聊] stack和heap的差別
時間Wed Aug 29 19:18:50 2007
※ 引述《sunneo (艾斯寇德)》之銘言:
: 作者: mystea (mystea) 看板: C_and_CPP
: 感覺起來, 這兩種memory都是用過以後可以回收再利用的.
: 差別好像是在於, stack每次要劃分多少都是先規劃好的,
: 而heap是可以隨著使用者的input在runtime決定劃分方法的.
計算機有 stack operation 的指令, 如 push pop 是微處理機
出來後才做成硬體指令支援. Stack 的特性就是會保留 history
也就是 LIFO , 這對 call/return 的遞迴應用很重要, recusive
function 的 local variable 多數放在 stack 裡跟著 call/return
隨後的 allocated block 走.
可是有些應用需要的 dynamic memory 未必就具有 History 的前後
次序特性, 而是跟 function call/return 無關, 使用的時間會持續
一段時間跨越好幾個來回的 function call . 例如寫一個可以適合
臨時輸入 n 維, 及其 dimension 大小可用輸入設定的 n-dim array.
這種 run-time 才能知道大小的 array 就用到 dynamic memory 也
就是 heap memory . heap memory 涉及回收整併, 一般都用 sorted
link list tree.
兩者需要的特性全然不同, buffer overflow 反而多數是隨 function
call 之後, 由 被呼叫的函數程式 使用 stack/heap 分配出來的臨時
工作用的 string array , 經由輸入 產生 data overflow 覆蓋到
stack 區的 return address 引起的問題. 這是因為 stack/heap 各
佔一段 memory block 的兩端, 分配時各往中間成長, 但實況去讀寫
時都不做 boundary address check.
:
: 但如果是這樣, 為什麼不乾脆就只有heap memory呢? 這樣子就不會
: 發生甚麼stack overflow的情形了. 程式在runtime執行code裡規劃好的
: 記憶體劃分應該不難才對呀?
:
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.115.1.146
※ 編輯: ggg12345 來自: 140.115.1.146 (08/29 19:27)