堆栈和堆的大小是否可变?

Are stack and heap variably sized?

根据许多资料,stackheap 是由空 space 划分的内存区域。据我所知,随着程序 运行ning.

堆栈和堆相互增长

这是否意味着 stackheap 都是可变大小的?如果是,它们中的一个是否可以占用另一个在前一个 运行 期间占用的相同地址(假设两个 运行 发生在相同的内存地址)?

如果它们的大小可变,我猜 stack overflow 发生在 stack 试图拿走属于 heap 的东西时。如果不是,则 stack bound 就是它的原样,并放置在两个内存区域之间最初为空的 space 中间的某个位置。

一点澄清: 大小的可变性 这里我的意思是改变保留的 space。也就是说,在这里我暗示如果 stack 大小是可变的,则为其保留的 space 会发生变化(就像当您使用 realloc 更改数组的大小时,但这只是为了比较) ; stack overflow 然后通过堆栈达到某个边界而发生,无论是另一个区域,如 heap 还是其他。如果它不是可变的,保留的space保持不变,而stack overflow只是由运行宁出保留的space造成的。我也想知道 heap 是否也有不同的大小。

堆栈在地址 space 中必须是连续的。堆没有这样的约束。除此之外的任何事情都取决于给定平台如何布置内存。

如果你的地址space不能有空洞,嵌入式设备的简单布局可以是:从地址n及以下是堆栈(堆栈往往向下增长),从n及以上可用于堆。静态是一些高地址,代码在 ROM 中。

Linux 和 Windows 运行 在带有 MMU 的平台上,因此在内存安排方面有更多选择。