静态如何在函数调用中保持其值

时间:2013-08-25 17:32:34

标签: c static

最近在一次采访中,我遇到了这个问题“静态变量如何在函数调用中保持其先前的值”。想了一会但是真的想不出任何有说服力的答案。有人可以解释一下吗?尝试做谷歌,找不到我的信息。

7 个答案:

答案 0 :(得分:5)

静态变量存储在.data区域中,其中存储了所有全局变量。并且这些全局和静态变量被分配为exec操作的一部分(即创建新进程/分支新进程)。

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

在上图中.data是存储在函数内声明或声明为全局变量的所有静态变量的区域。 希望这会有所帮助。

答案 1 :(得分: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;
}

我并不是说我们应该练习这个! ;)

答案 2 :(得分:1)

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


C11 5.1.2“所有具有静态存储持续时间的对象都应初始化(设置为它们的 程序启动前的初始值。“

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

答案 3 :(得分:1)

将函数范围的静态变量视为全局变量,仅对它们所定义的函数的范围可见。

答案 4 :(得分:1)

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

  

对象的生命周期是程序执行期间的一部分   保证保留哪个存储空间。存在一个对象,   具有恒定的地址,并始终保留其最后存储的值   它的一生。

第3段:

  

一个对象,其标识符与存储类一起声明为 [SNIP]   说明符静态,具有静态存储持续时间。它的一生就是   程序的整个执行及其存储的值被初始化   程序启动前只有一次。

这就解释了为什么需要来维持以前的值,而不是 它是如何做到的(告诉实现如何做事,这不是标准的工作,只是什么他们必须这样做。)

如何这样做?无论如何,实现都选择这样做。你可以很容易地问为什么它不会维持它以前的价值。

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

Description on 'static keyword'