【问题标题】:how does a static variable not get reassigned when inside the function在函数内部如何不重新分配静态变量
【发布时间】:2017-03-30 05:42:19
【问题描述】:

我对@9​​87654321@ 问题中的答案有疑问,但我无法对此发表评论,因为我的代表人数少于 50。

我想知道答案foo() 被多次调用并且静态变量被分配了相同的次数。那么为什么静态变量不是每次都重新赋值为10呢?

【问题讨论】:

  • 你可以想象在应用程序启动期间(在进入 main 之前)正在处理的静态变量的初始化程序

标签: c recursion static initialization storage-duration


【解决方案1】:

你得到了更简短的答案,但让我稍微扩展一下。

任何对象,都有一个storage duration。存储时长决定了对象(或变量)的“寿命”

静态存储是存储时长之一,由关键字static 标记。现在,为了详细说明生命周期,让我们检查C11 标准的相关部分,第 6.2.4 章。

从第 2 段开始,

对象的生命周期是程序执行的一部分,在此期间存储是 保证为它保留。 一个对象存在,有一个不变的地址并保留 它在其整个生命周期中的最后存储值。 [....]

因此,在整个生命周期中都会保留最后存储的值。

现在,对于具有静态存储持续时间的对象,第 3 段,

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

现在,关于你的问题,你看到的语句是初始化,根据指定的规则,它只发生一次(在程序启动之前),所以初始化不会重复多个函数调用。变量保留最后存储的值。

【讨论】:

    【解决方案2】:

    实际上static 变量可以重新分配。但不能重新定义

    一旦定义了static 变量,它就不能在程序的整个生命周期内重新定义。但是我们可以改变这个值。

    【讨论】:

    • 哦,好吧,我的错,我没有意识到它正在被重新定义。我现在看到了,谢谢!
    • 那么,非静态变量可以重新定义吗?这有点夸大其词,可能会产生误导......
    【解决方案3】:

    当您定义一个静态或全局变量时,它会进入内存模型的数据段并在程序的整个生命周期中占用该分配,当然范围与定义它的每个变量相关联。所以当你再次进入函数时,变量存在并且它也记住了最后的内容。所以理想情况下你不能重新定义一个变量,如果你用条件绑定它,那么范围将保护它,因此它是一个新变量。

    【讨论】:

      猜你喜欢
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多