【问题标题】:Why is the stack address lower than that of heap in Visual C++?为什么在Visual C++中栈地址比堆地址低?
【发布时间】:2013-07-25 15:38:17
【问题描述】:

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

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

【问题讨论】:

    标签: visual-c++ heap-memory stack-memory


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢你的帮助,但我想知道谁负责为stock和heap分配地址,编译器还是操作系统?我发现很多书在阐述 Linux 下进程的虚拟地址时都有相同的假设。如果给出相同的编译器,Windows 的内存布局是否与 Linux 相同?
    • 在 Windows 上,这是操作系统的责任。
    猜你喜欢
    • 2017-11-11
    • 2011-09-04
    • 2022-10-20
    • 2011-04-01
    • 1970-01-01
    • 2011-10-15
    • 2018-06-25
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多