C++内存地址

leijiwei2009 2009-04-24 09:29:27
void main()
{
int a = 1;
}
假如a的地址是 0x0013ea,那么“a”即变量名是如何和地址关联的?
...全文
243 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
whillcoxdennis 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wangyadong 的回复:]
引用 2 楼 leijiwei2009 的回复:
如果底下再用到a的话,肯定是去内存中寻找它的地址,那么从名字到地址是怎么查找的?

编译器在编译的时候就把所有的局部变量从名字变成固定的相对于帧顶的偏移
也就是编译完以后就是个地址了
[/Quote]
正解
ltc_mouse 2009-04-24
  • 打赏
  • 举报
回复
编译是个相当复杂的过程~ 分不同阶段,处理不同的事情。并不是变量换算地址一步到位的~

等lz学习了编译原理,对这个问题就不会迷惑了
lzh9955 2009-04-24
  • 打赏
  • 举报
回复
22222
ForestDB 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yhuib 的回复:]
局部变量编译后直接就用地址了,看不到变量名
[/Quote]
同上,在栈上的一个偏移。
lijinfenghust 2009-04-24
  • 打赏
  • 举报
回复
简单一点理解,编译器编译后的执行文件里面这么写的

mov [0x0013ea],1


实际上 ,在32位下面 ,应该是这么写的:

_main:
push ebp
mov ebp,esp
add esp,4 ;分配a的空间
mov [ebp-4],1;对a赋值
ret
datacodebugs 2009-04-24
  • 打赏
  • 举报
回复
When compiler compiling the c source file, it will reserve stack space
for variant a, and it's size should be 4 alignment. Then a has a address
0x0000, 13e8(not 0x0000, 13ea), and a value of 4.
chenzhp 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wangyadong 的回复:]
引用 2 楼 leijiwei2009 的回复:
如果底下再用到a的话,肯定是去内存中寻找它的地址,那么从名字到地址是怎么查找的?

编译器在编译的时候就把所有的局部变量从名字变成固定的相对于帧顶的偏移
也就是编译完以后就是个地址了
[/Quote].
rlink 2009-04-24
  • 打赏
  • 举报
回复
局部变量一般都存储在栈中,随着函数的调用结束而自动销毁。但局部变量中的static 变量除外。
wangyadong 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 leijiwei2009 的回复:]
如果底下再用到a的话,肯定是去内存中寻找它的地址,那么从名字到地址是怎么查找的?
[/Quote]
编译器在编译的时候就把所有的局部变量从名字变成固定的相对于帧顶的偏移
也就是编译完以后就是个地址了
leijiwei2009 2009-04-24
  • 打赏
  • 举报
回复
如果底下再用到a的话,肯定是去内存中寻找它的地址,那么从名字到地址是怎么查找的?
yhuib 2009-04-24
  • 打赏
  • 举报
回复
局部变量编译后直接就用地址了,看不到变量名
baihacker 2009-04-24
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20090213/22/e0fea938-5b98-487d-b430-ecc06a198a47.html

希望能看懂我的回答.
roye2002 2009-04-24
  • 打赏
  • 举报
回复
那个就是 变量名和存储地址的绑定过程。
pathuang68 2009-04-24
  • 打赏
  • 举报
回复
学习
plaindew 2009-04-24
  • 打赏
  • 举报
回复
这是编译器的事
  • 打赏
  • 举报
回复
这个问题以前有人问过..我是回答不了.我不做编译器.
thinkboy234 2009-04-24
  • 打赏
  • 举报
回复
学习~~
icansaymyabc 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用楼主 leijiwei2009 的帖子:]
void main()
{
int a = 1;
}
假如a的地址是 0x0013ea,那么“a”即变量名是如何和地址关联的?
[/Quote]

可以这样理解:经过编译以后,源代码中所有的 “a”都被 0x0013ea 替换掉了。
Sou2012 2009-04-24
  • 打赏
  • 举报
回复
MARK!!
xghuzd 2009-04-24
  • 打赏
  • 举报
回复
我想还是把书看懂,再说吧
加载更多回复(1)

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧