在流程执行期间,全局变量的地址是否保证保持不变?

时间:2015-10-11 11:57:14

标签: c pointers static global-variables

在整个流程执行期间,全局变量的地址是否保证相同?也就是说,我有

static int dummy;

我用

something(&dummy);

在我的代码中的几个不同的地方。 &dummy会不会发生变化,还是可以安全地将其用作不太可能被其他库重用的密钥(例如在散列图中)?

当然,这是假设我没有重新启动程序或重新加载库。

(背景:Lua邮件列表上的某些人向我推荐了这个。我一直在使用它here。)

2 个答案:

答案 0 :(得分:4)

是。来自C99规范:

  

[6.2.4] 对象的生命周期是程序执行的一部分,在此期间保证为其保留存储。存在一个对象,具有常量地址,并在其整个生命周期内保留其最后存储的值。

答案 1 :(得分:2)

是的,C11§6.2.4规定:

  

[2]对象的生命周期是存储期间程序执行的一部分   保证为它保留。 对象存在,具有常量地址,33)并保留   它在其整个生命周期中的最后存储值。 34)如果一个对象被引用到它之外   一生,行为是不确定的。当指针变为不确定时,指针的值变得不确定   它指向(或刚刚过去)的对象到达其生命周期的末尾。

     

[3]一个对象,其标识符是在没有存储类说明符的情况下声明的   _Thread_local,可以是外部或内部链接,也可以是存储类   说明符静态,具有静态存储持续时间。 它的生命周期是整个执行的   程序,其存储值仅在程序启动前初始化一次。

脚注33:

  

33)术语“常量地址”意味着指向对象的两个指针可能不同   时间会比较平等。在两次不同的执行期间,地址可能不同   程序