【发布时间】:2015-09-02 07:11:02
【问题描述】:
一些书籍和网页告诉我有关 C 程序的内存布局的知识。比如栈的地址比堆高,全局变量的地址比栈低。但我发现这不是真的:
D:\code>输入 testlayout.cpp
#include <stdio.h>
int g;
int main()
{
int loc = 0;
printf("%p %p\n", &g, &loc);
}
D:\code>cl testlayout.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 17.00.61030 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
testlayout.cpp
Microsoft (R) Incremental Linker Version 11.00.61030.0
Copyright (C) Microsoft Corporation. All rights reserved.
/out:testlayout.exe
testlayout.obj
D:\code>testlayout.exe
000000013F2222C0 000000000022FB20
D:\代码>
谁能解释一下为什么全局变量的地址比局部变量的地址大。
【问题讨论】:
-
也许因为,这就是编译器映射不同段的方式。
-
因为这是您的系统决定放置东西的地方。没有真正的理由以一种或另一种方式拥有事物 - 除了自定义之外,堆栈通常位于虚拟内存中的高地址。但是你也可以把栈放在低地址,把数据变量放在高地址。
-
@Lundin,我不认为他们是同一个问题。
-
@SouravGhosh 我正要说同样的话,但是 SS 和 DS 段在 x86-64 架构中重叠(即没有按原样使用分段),请阅读here