2013-07-25 54 views
0

大家都知道,堆栈地址是比进程地址空间堆地址更高。但是当我编写一个程序在VS2010中验证它时,我遇到了一些麻烦。 堆栈的地址低于堆,甚至低于数据段的地址。该程序如下所示:为什么堆栈地址低于Visual C++中的堆栈地址?

#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:对不起,没有图片由于我的名声不好,或者我可以更清楚地说明我的问题。

回答

2

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

这里你的假设是错误的。堆和栈都从进程的虚拟地址空间分配,他们可以为所有意图和目的,位于该地址空间的任何地方。

+0

感谢ü的帮助,但我不知道谁是负责股票和堆,编译器或操作系统分配的地址的?我发现很多书在阐述Linux下的进程虚拟地址时都有相同的假设。如果给出相同的编译器,Windows将具有与Linux相同的内存布局吗? – TJUer

+0

在Windows上,这是操作系统的责任。 –