堆、栈和一些数据段、代码段在内存中的先后位置是固定的,还是随意的?

我看到大多数的虚拟内存图都是类似下面这个图,我以为先后顺序应该也是这样的,也就是堆栈在内存空间地址总是大于程序数据、代码的。但是我在VS上打印,这个先后顺序却是不固定的。

第一次运行

第二次运行

阅读 2.9k
2 个回答
新手上路,请多包涵

Windows下面,堆栈都是分了很多段的。不是只有一个连续的地址段。

这张图想表达的意思其实是,堆是往上增长的,栈是往下增长的。但是相对位置关系并不固定,跟具体的操作系统实现有关。

在操作系统里面,你的程序的代码段跟数据段有各自的独立的空间,由系统帮你映射到一个连续的空间内,所以你看到的好像是一个连续的唯一地址。其实你如果从较小的地址向较大逐一访问的化,你并不能从数据段跨越到代码段,或从代码段跨越到数据段,你大概率会碰到未映射的地址,然后产生缺页错误而崩溃。
所以两个段谁在前谁在后,完全是看怎么映射的,用户也不需要关心这个。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题