各种变量在内存中的高地址低地址问题

测试环境:c++ ,vs2005, release:http://hi.baidu.com/solohac/item/f056894286152793833ae14b

先确认一下这里“低地址高地址”的定义,这里并不是指的大端小端中的地址高低,而是内存中的地址,如下:

 
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)

结论:由于堆是往高地址生长的,所以先声明的变量位于低地址。

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值