2013-08-25 39 views
0

最近在一次面试中,我遇到了这个问题:“静态变量如何在函数调用中保持其先前的值”。想了一会儿,但真的想不出任何令人信服的答案。任何人都可以解释一下吗?试图做Google,找不到我的信息。静态如何通过函数调用维护其价值

+7

全局变量如何保持其值? –

回答

0

正在执行的程序的整个生命周期中都存在一个静态变量。当执行线程离开声明它的函数时,它不会停止存在。所以,它永远不会失去它的价值。

1

静态变量(在函数内部还是不在函数内)位于全局内存空间中。它们在程序开始时被初始化并驻留程序的长度。


C11 5.1.2“具有静态存储中的所有对象应程序启动之前对其进行初始化(设置为它们 初始值)。”

6.2.4.3“...它的生命周期是程序的整个执行过程,它的存储值在程序启动之前只初始化一次。”

1

的功能想想作用域为全局变量只对函数的范围可见他们。

5

静态变量存储在所有的全局变量存储的。数据区正在定义静态变量。这些全局和静态变量作为exec操作的一部分进行分配(即创建一个新进程/分配一个新进程)。

  ----------------------- 
     | Command Line Arg | 
     |---------------------| 
     |  Stack   | 
     |  \/    | < Grow downward 
     |---------------------| 
     |  /\    | 
     |  Heap   | < Grows Upward 
     |---------------------| 
     |  .bss   | (Uninitialized global variables) 
     |---------------------| 
     |  .data   | (initialized global/static variables) 
     |---------------------| 
     |  .text   | 
     ----------------------- 

在上面的图。数据是区域,所有这些声明的函数内部或声明为全局变量存储在静态变量。 希望这有助于。

0

我给你一个可以帮助你想的参考。

Description on 'static keyword'

+0

该链接不是链接;我想你跳过了'http://'。 –

+0

对不起! –

1

引用ISO C标准,6.2.4节第2段:

寿命的对象的是哪个存储是保证将保留在程序执行期间 的部分为了它。存在一个对象, 具有一个固定的地址,并在整个 的生存期中保留其最后存储的值。

第3段:

其标识符被声明[SNIP]与存储类 符静态,具有静态存储持续时间的对象。它的使用期限是程序的整个执行过程,其存储值在程序启动之前仅初始化为 一次。

这也解释了为什么它是需要保持其以前的值,但不如何它这样做(这不是标准的工作,告诉实现如何做的事情,他们必须怎么做)。

如何它这样做?实现选择以任何方式使其实现。你可以轻易地问为什么它不会保持以前的价值。

但基本上它存储在你的main函数启动之前分配的内存的某个区域中,只要程序正在运行,并且只有程序本身不会修改其内容,才会释放内存区域。

在这方面,在文件范围中定义的对象与在关键字static之间的函数内定义的对象之间没有区别;两个对象都具有静态存储持续时间,并且可能被存储在相同的内存区域中。

4

简而言之,函数内部的静态变量与全局变量相似。编译器对可见性和对变量的访问进行所有必要的检查。除此之外,这只是另一个全球变种。

因此,它是合法的做到这一点:

int *test_static() 
{ 
    static int func_var = 1234; 
    printf("%d", func_var); 

    return &func_var; // return pointer to int 
} 

int main() 
{ 
    int *i = test_static(); // will print '1234' and point i to func_var 

    // we can't do "func_var = 99;" here, but... 

    *i = 99; 
    test_static(); // will print '99' 

    return 0; 
} 

我不建议我们应该实践这虽然! ;)

相关问题