2014-03-19 42 views
0
BOOL foo(void){ 

    static BOOL displayed = FALSE; 
    static BOOL initialized = FALSE; 

    if (displayed) 
     return FALSE; 

    //more code 

    displayed = TRUE; 
    return FALSE; 
} 

C中静态局部变量的含义是什么?C中静态局部变量的含义是什么?

如果第二次调用此方法,displayed将不会重新初始化为FALSE?

+0

https://stackoverflow.com/questions/14992116/cc-the-purpose-of-static-const-local-variable – Brian

+0

可能重复[什么是静态局部变量的用法,当我们可以得到一个全局变量在同样的成本?](http://stackoverflow.com/questions/15808049/what-is-the-use-of-static-local-variable-when-we-can-get-a-global-variable-at -th) – Brian

+0

如果第二次调用此方法,显示将不会重新初始化为FALSE? - 不,它会保留上次分配给它的值 –

回答

4

静态局部变量在程序启动之前仅初始化一次。然后他们的价值观在调用之间持续存在。

从标准,部分6.2.4/3存储对象的持续时间:

其标识符,而不存储类说明 _Thread_local被声明,并且用外部或内部联动装置或与一个对象存储级 说明静态,具有静态存储持续时间。它的生命周期是 程序的全部执行,并且在程序启动之前,其存储值仅初始化一次。

+0

,这很奇怪。当我的代码重新分配这个静态变量,它会改变一次。 –

+0

我不明白,在我的代码中有评论 –

+0

有一行'显示= TRUE;',我看到它只改变了一次的值。你说在程序启动之前该值被设置了一次。“但是我看到它在第一次运行后会改变一次 –

0

在编译器分配内存时,初始化只执行一次。该变量在程序执行期间保留其值。

1

静态变量仅初始化一次。 这可以在特殊情况下使用,如计算函数的运行时执行次数。 静态变量的生存时间与全局变量相同。但是它们的范围仅限于定义的范围。

0

静态自动变量即使在其定义的块终止之后仍然存在。因此,函数中静态变量的值在对同一函数的重复函数调用之间保留。静态自动变量的范围与自动变量的范围相同,即它在其定义的块中是局部的;然而,分配的存储在程序期间变为永久存储。静态变量可以在其声明中初始化;然而,初始化器必须是常量表达式,并且在为静态变量分配内存时,在编译时仅初始化一次。

相关问题