为什么Keil 里面定义的全局静态变量在两个函数中的地址不一

[复制链接]
 楼主| ruiwei0201 发表于 2009-1-7 14:34 | 显示全部楼层 |阅读模式
 楼主| ruiwei0201 发表于 2009-1-7 16:02 | 显示全部楼层

知道是什么问题了,不知道怎么准确描述

我的理解是这样的,全局静态变量在编译时编译器会分配一个地址,而每次在函数中使用该变量时,要确保其在编译时的初始值,所以在函数中使用时会有不同的地址。
computer00 发表于 2009-1-7 17:17 | 显示全部楼层

静态变量在函数返回后值依然要保存,其生存周期是全局的

所以地址必须要不一样,不能覆盖。
ayb_ice 发表于 2009-1-7 20:34 | 显示全部楼层

LZ太想当然了吧

HWM 发表于 2009-1-7 20:46 | 显示全部楼层

若是直接引用,不可能两样。而若是参数传送,

建议楼主具体了解一下“传值”和“传地址”的差别。
djyos 发表于 2009-1-7 23:33 | 显示全部楼层

keil的全局变量

    一般来说,全局变量有一个唯一的地址,但keil比较特殊。它为了节省51那可怜的一点点内存,使用了覆盖技术。
    如果你在程序某个地方访问了全局变量,但编译器判断到该全局变量的值不再被使用,就会释放掉它,局部变量就有机会重复利用这个地址,keil的局部变量不是在栈中分配的。当你再次访问这个全局变量时,又会重新分配,地址就不一样了。总之,如果你在若干个地方使用了该全局变量,而该变量的值又不互相依赖的话,每次都可能是重新分配的,地址自然不一样。
computer00 发表于 2009-1-7 23:37 | 显示全部楼层

不会吧...还有这样的事?全局变量的地址都会变?

E007 发表于 2009-1-7 23:41 | 显示全部楼层

没听说过也没碰到过这种事~

    我通常的做法是直接给全局变量"定位",HOHO~~~
xwj 发表于 2009-1-7 23:48 | 显示全部楼层

我想,是LZ把全局变量和静态变量搞混了

请先弄清楚各种变量的作用域和生存周期
zyok 发表于 2009-1-7 23:52 | 显示全部楼层

看看有没有越界使用的数组。。。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

149

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

28

主题

149

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部