Re: [轉錄][閒聊] stack和heap的差別

看板PLT作者 (ggg)時間17年前 (2007/08/29 19:18), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/3 (看更多)
※ 引述《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)
文章代碼(AID): #16rLORUa (PLT)
文章代碼(AID): #16rLORUa (PLT)