作者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)