Visual c++ 为什么在visualc+中堆栈地址低于堆地址+;?

Visual c++ 为什么在visualc+中堆栈地址低于堆地址+;?,visual-c++,stack,heap,Visual C++,Stack,Heap,众所周知,在进程地址空间中,堆栈地址高于堆地址。但是,当我在VS2010中编写一个程序来验证它时,我遇到了一些麻烦。堆栈的地址低于heap,甚至低于数据段的地址。程序如下所示: #include "stdafx.h" #include "malloc.h" static int g_a=123; int g_b=123; int main() { static int a=123; int b=123; float c[10]={0}; int *p1=(int*

众所周知,在进程地址空间中,堆栈地址高于堆地址。但是,当我在VS2010中编写一个程序来验证它时,我遇到了一些麻烦。堆栈的地址低于heap,甚至低于数据段的地址。程序如下所示:

#include "stdafx.h"
#include "malloc.h"
static int g_a=123;
int g_b=123;
int main()
{
    static int a=123;
    int b=123;
    float c[10]={0};
    int *p1=(int*)malloc(sizeof(int));
    int *p2=(int *)malloc(5*sizeof(int));
}
根据VS2010,以下是他们的地址:

&g_a    0x01097038 
&g_b    0x0109703c
&a      0x01097040

&b      0x002af7a8
c       0x002af778

p1      0x00571500
p2      0x00571540
显然,指向堆上数组的指针p1的地址比堆栈上的&b的地址大。这就是为什么

PS:对不起,由于我的名声不好,没有照片,或者我可以更清楚地描述我的问题

“众所周知,在进程地址空间中,堆栈地址高于堆地址。”


你在这里的假设是错误的。堆栈和堆都是从进程的虚拟地址空间分配的,出于所有目的,它们实际上可能位于该地址空间中的任何位置。

感谢您的帮助,但我想知道谁负责为库存和堆分配地址,编译器还是操作系统?我发现很多书在阐述Linux下进程的虚拟地址时都有相同的假设。如果提供相同的编译器,Windows是否具有与Linux相同的内存布局?在Windows上,这是操作系统的责任。