为什么堆栈和堆在内存中分离得如此之多?

Why stack and heap are so much separated in memory?

我正在学习 C++ 并执行这段代码

#include<stdio>
using namespace std;

int main(){

    char* buffer = new char[5];
    printf("%p", &buffer);                // 000000000061fe10
    cout<<endl;
    printf("%p", buffer);                  // 0000000000796b700
}

给了我 2 个完全分开的内存位置,我的意思是大约 150 万字节,那么为什么堆大小应该是 5 个字节,对吗? char size * 5. 堆向下增长(从 0xFFF... 到 0x0000..) 在堆下面有堆栈,所以差异应该小得多,所以在这种情况下内存布局是什么。我在上面的解释中不完全理解的是什么

内存布局取决于操作系统、程序加载器(通常随操作系统一起提供)、有关可执行文件的规则以及对链接器的请求。您还没有指定您使用的操作系统,因此无法给出明确的答案。

但是,内存地址是任意的。如果一个工匠把他们的工具、他们的说明、他们的零件和他们的工作space摆出来,他们可以按照他们想要的方式排列它们。不需要堆栈靠近堆。很可能,堆已经被分配了一个高地址,这样虚拟内存中就有足够的空间 space 让它向下增长,或者它下面的东西向上增长。由于虚拟内存是通过从虚拟地址到物理地址的任意映射创建的,因此对它的布局几乎没有限制——一个程序可以在这里使用几个地址,在另一个地方使用几个地址,在另一个地方使用几个地址,并且它可以在它们之间留下很多未使用的space,而那些未使用的space不会消耗任何内存,因为它没有映射到物理内存。所以虚拟内存是按照人们觉得方便的方式来布置的。