【问题标题】:Is the address of a global variable guaranteed to stay the same during the process execution?全局变量的地址是否保证在流程执行期间保持不变?
【发布时间】:2015-10-11 11:57:14
【问题描述】:

在整个流程执行过程中,全局变量的地址是否保证一致?也就是说,我有

static int dummy;

我用

something(&dummy);

在我的代码中的几个不同的地方。 &dummy 会不会改变,或者我可以安全地将它用作不太可能被另一个库重用的密钥(例如在哈希图中)?

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

(上下文:这是 Lua 邮件列表中的一些人向我推荐的。我一直在使用它 here。)

【问题讨论】:

  • 是的,它确实保持不变。
  • 我希望并祈祷,即使是本地 var 的地址,一旦分配,在整个过程执行期间也会说同样的话(假设它永远不会被破坏)。如果他们开始四处走动,我在每个项目上的所有代码库都注定要失败。

标签: c pointers static global-variables


【解决方案1】:

是的。来自 C99 规范:

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

【讨论】:

    【解决方案2】:

    是的,C11§6.2.4 规定:

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

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

    脚注 33:

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

    【讨论】:

      猜你喜欢
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-07
      • 2016-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多