可能重复:
堆栈和堆的内容和位置
我安装的Ubuntu的默认堆栈大小限制为8 MB.但我很好奇为什么我们需要限制用户程序的堆栈大小.同一个程序可以通过malloc/mmap等使用它的所有4 GB(32位程序)可寻址空间.那么为什么我们需要一个堆栈大小限制呢?为什么堆栈不能增长直到它几乎遇到堆?
事实上,堆栈确实增长得越来越多。它不需要开始很大,因为在一般情况下,它不需要很大。让它变得非常大会导致浪费内存占用。
我不是 100% 确定堆栈是如何在 Linux 上实现的,但在 Windows 上,为堆栈保留了大量空间。这个数量可以在编译器选项中设置(对于深度递归程序,您可能需要更大的堆栈)。在运行时,可以通过保护页面系统动态扩展堆栈。在堆栈的末尾有一个保护页,当点击它时会将堆栈扩展一个额外的页面并将保护页向前推一个。
堆栈探测是另一个有趣且相关的概念。所以你的问题是“为什么堆栈不能增长直到它几乎与堆相遇?” 堆栈确实会增长,但由于大部分时间拥有巨大的堆栈可能是错误的不良副作用,因此保留的大小不会很大(尽管这是可以设置的)。
这篇文章非常有趣并且与您的问题相关。