在整个流程执行期间,全局变量的地址是否保证相同?也就是说,我有
static int dummy;
我用
something(&dummy);
在我的代码中的几个不同的地方。 &dummy
会不会发生变化,还是可以安全地将其用作不太可能被其他库重用的密钥(例如在散列图中)?
当然,这是假设我没有重新启动程序或重新加载库。
(背景:Lua邮件列表上的某些人向我推荐了这个。我一直在使用它here。)
答案 0 :(得分:4)
是。来自C99规范:
[6.2.4] 对象的生命周期是程序执行的一部分,在此期间保证为其保留存储。存在一个对象,具有常量地址,并在其整个生命周期内保留其最后存储的值。
答案 1 :(得分:2)
是的,C11§6.2.4规定:
[2]对象的生命周期是存储期间程序执行的一部分 保证为它保留。 对象存在,具有常量地址,33)并保留 它在其整个生命周期中的最后存储值。 34)如果一个对象被引用到它之外 一生,行为是不确定的。当指针变为不确定时,指针的值变得不确定 它指向(或刚刚过去)的对象到达其生命周期的末尾。
[3]一个对象,其标识符是在没有存储类说明符的情况下声明的 _Thread_local,可以是外部或内部链接,也可以是存储类 说明符静态,具有静态存储持续时间。 它的生命周期是整个执行的 程序,其存储值仅在程序启动前初始化一次。
脚注33:
33)术语“常量地址”意味着指向对象的两个指针可能不同 时间会比较平等。在两次不同的执行期间,地址可能不同 程序