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

Kha*_*led 2 c++ stack heap-memory

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

#include<stdio>
using namespace std;

int main(){

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

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

Eri*_*hil 9

内存的布局取决于操作系统、程序加载器(通常与操作系统一起提供)、有关可执行文件的规则以及提供给链接器的请求。您尚未指定您使用的是哪个操作系统,因此不可能有明确的答案。

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