为什么堆栈地址低于Visual C ++中堆的地址?

时间:2013-07-25 16:04:08

标签: visual-c++ stack heap

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

#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:很抱歉由于我的声誉不佳导致缺席,或者我可以更清楚地描述我的问题。

1 个答案:

答案 0 :(得分:2)

  

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

你在这里的假设是错误的。堆栈和堆都是从进程的虚拟地址空间分配的,并且出于所有意图和目的,它们几乎可以位于该地址空间的任何位置。