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
测试环境: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
- C语言知识盲点
- C语言盲点笔记1
- 知识盲点
- 知识盲点整理:
- JavaScript知识盲点
- php知识盲点
- c++知识盲点,自查
- top域名知识盲点
- Pig 知识盲点
- Hive 知识盲点
- JAVA语言使用盲点
- 关于继承的知识盲点
- 笔记练习中的知识盲点
- 寻找知识区的盲点
- hibernate随笔(知识盲点)
- C/C++面试遇到的几个知识盲点以及编程问题
- C语言知识列表
- C语言 小知识!~
- linux进程调度
- 【vim小记】自动保存配置
- How to Calculate Your Shared Pool Size (文档 ID 1012046.6)
- java Calendar获取日期和查表法获取日期
- cocos2d-x学习笔记03——动画
- C语言知识盲点
- Windows下轻松加载BMP, GIF, JPEG, PNG, and TIFF图片
- cocos2d-x v2.2.1新建项目遇到的问题
- Ubuntu Mysql 安装
- ORACLE EXP/IMP 说明 .
- 动力互换,鼓励自造--含2013个人总结
- 正确使用日志的10个技巧
- hdu1131(卡特兰数)
- ALSA 用户空间之 TinyAlsa