如何在函数内部重新分配静态变量

时间:2017-03-30 05:42:19

标签: c recursion static initialization storage-duration

我对this问题中的答案有疑问,但我不能发表评论,因为我的代表不到50。

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

3 个答案:

答案 0 :(得分:3)

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

任何对象都有 storage duration 。存储持续时间决定了对象(或变量)的“生命周期”

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

来自第2段,

  

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

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

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

  

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

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

答案 1 :(得分:1)

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

定义static变量后,无法在程序的整个生命周期内重新定义。但我们可以改变价值。

答案 2 :(得分:0)

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