C语言知识盲点

来源:互联网 发布:lovelivesunshine淘宝 编辑:程序博客网 时间:2024/05/21 16:39

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

测试环境: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


0 0