【发布时间】:2021-03-15 23:57:12
【问题描述】:
根据许多消息来源,stack 和heap 是由空白空间划分的内存区域。据我所知,堆栈和堆在程序运行时会相互增长。
这是否意味着stack 和heap 的大小都是可变的?如果是,它们中的一个是否可以占用上一次运行期间另一个占用的相同地址(假设两次运行发生在相同的内存地址)?
如果它们的大小可变,我猜stack overflow 会在stack 尝试获取属于heap 的东西时出现。如果没有,stack bound 就是它的本来面目,并放置在两个内存区域之间的初始空白空间中间的某个位置。
澄清一点:这里的大小可变性是指更改保留空间。也就是说,这里我的意思是如果stack 的大小是可变的,则为其保留的空间会发生变化(例如,当您使用realloc 更改数组的大小时,但这只是为了比较);然后,stack overflow 会在堆栈达到某个界限时发生,无论是另一个区域,如 heap 还是其他区域。如果不可变,则保留空间保持不变,stack overflow 仅仅是保留空间用完引起的。而且我还想知道heap 的大小是否也是可变的。
【问题讨论】:
-
您所描述的架构非常简单,对于现代(PC)系统来说并不是真正的实际,这些系统具有虚拟内存并且可以具有由千兆字节未映射空间分隔的不同内存区域,因此没有办法溢出堆栈,以便它会到达堆。
-
许多实现在不同区域之间都有保护页面,旨在捕获从一个区域到另一个区域的任何溢出/下溢。
-
好的,但是它们的大小是可变的吗?
标签: c stack heap-memory