测试环境:c++ ,vs2005, release
先确认一下这里“低地址高地址”的定义,这里并不是指的大端小端中的地址高低,而是内存中的地址,如下:
00421ae0为相对低地址,00421ae8为相对高地址.
1.全局变量
#include "stdafx.h"
int gNumber1 = 1234;
int gNumber2 = 5678;
int _tmain(int argc, _TCHAR* argv[])
{
scanf("%d %d", &gNumber1, &gNumber2);
00401000 push offset gNumber2 (40301Ch)
00401005 push offset gNumber1 (403018h)
0040100A push offset string "%d %d" (4020E4h)
0040100F call dword ptr [__imp__scanf (4020A0h)]
printf("%d %d",gNumber1, gNumber2);
00401015 mov eax,dword ptr [gNumber2 (40301Ch)]
0040101A mov ecx,dword ptr [gNumber1 (403018h)]
00401020 push eax
00401021 push ecx
00401022 push offset string "%d %d" (4020E4h)
00401027 call dword ptr [__imp__printf (402098h)]
0040102D add esp,18h
return 0;
00401030 xor eax,eax
}
00401032 ret
可以看到后声明的全局变量gNumber2 地址:40301Ch,先声明的gNumber1 地址为:403018h
结论:先定义的全局变量位于低地址,后定义的位于高地址。
2.栈中变量
(栈中变量指的是由编译器自动分配释放的变量)
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
00401000 sub esp,8
int gNumber1 = 1234;
int gNumber2 = 5678;
scanf("%d %d", &gNumber1, &gNumber2);
00401003 lea eax,[esp]
00401006 push eax
00401007 lea ecx,[esp+8]
0040100B push ecx
0040100C push offset string "%d %d" (4020E4h)
00401011 mov dword ptr [esp+10h],4D2h
00401019 mov dword ptr [esp+0Ch],162Eh
00401021 call dword ptr [__imp__scanf (4020A0h)]
printf("%d %d",gNumber1, gNumber2);
00401027 mov edx,dword ptr [esp+0Ch]
0040102B mov eax,dword ptr [esp+10h]
0040102F push edx
00401030 push eax
00401031 push offset string "%d %d" (4020E4h)
00401036 call dword ptr [__imp__printf (402098h)]
return 0;
0040103C xor eax,eax
}
0040103E add esp,20h
00401041 ret
注意这2句
00401011 mov dword ptr [esp+10h],4D2h
00401019 mov dword ptr [esp+0Ch],162Eh
可以看出 gNumber1 为:esp+10h, gNumber2 为:esp+0Ch。如图:
由于变量位于栈中,esp为栈顶,所以gNumber1 位于高地址,gNumber2位于低地址。
结论:由于栈是往低地址生长的,所以先声明的变量位于高地址。
3.堆中变量
(堆中变量指的是由程序员分配释放的变量,例如new,malloc)
结论:由于堆是往高地址生长的,所以先声明的变量位于低地址。
以上内容参考 http://hi.baidu.com/solohac/item/f056894286152793833ae14b