【问题标题】:How the static variable gets retrieved for every function call如何为每个函数调用检索静态变量
【发布时间】:2016-06-01 09:26:24
【问题描述】:

我们知道,当控件退出函数时,堆栈空间将被释放。那么静态变量会发生什么。它们会保存在任何内存中并在函数被调用时检索吗??

【问题讨论】:

    标签: c function static


    【解决方案1】:

    wiki 说:

    在 C 编程语言中,静态与全局变量一起使用 和函数将其范围设置为包含文件。在当地 variables,static用于将变量静态存储在 分配的内存而不是自动分配的内存。 虽然 该语言不规定任何一种类型的实现 内存,静态分配的内存通常保留在数据中 程序段在编译时,而自动 分配的内存通常实现为临时调用堆栈。

    静态局部变量:在函数内部声明为静态的变量 静态分配,同时具有与自动相同的范围 局部变量。因此,无论函数放入它的任何值 一次调用期间的静态局部变量仍然存在,当 再次调用函数。

    【讨论】:

    • 谢谢拉胡尔。所以静态变量是在编译时分配内存的,对吧??
    • 感谢您强调语言未指定实现。
    • @seereddisekhar 它们实际上并没有在编译时被分配,当您运行可执行文件时,加载程序将根据可执行文件中的指定在内存中调整可执行文件的速度。因此实际分配将在加载时发生,但在编译规范时,将定义相对地址和偏移量。
    • 感谢@phoxis 的校准
    【解决方案2】:

    是的,静态变量在函数调用之间保持不变。它们位于程序的数据部分,就像全局变量一样。

    您可以(并且可能应该)阅读更多关于 C 应用程序的一般内存布局here

    【讨论】:

    • 函数调用完成后数据段不会被清除??
    • 不,当函数完成执行时,数据部分不受影响。
    【解决方案3】:

    在之前给出的答案之上添加更多信息 -

    静态对象的内存是在编译/链接时分配的。它们的地址由链接器根据链接器控制文件固定。

    链接器文件定义了不同程序区域的物理内存布局(闪存/SRAM)和布局。

    静态区域实际上被细分为另外两个部分,一个用于初始值,另一个用于在运行时完成的更改。

    最后,请记住,如果您不另行指定,则该值将在编译期间设置为 0。

    【讨论】:

      【解决方案4】:

      您错误地假设static 变量在使用它们的函数运行时被放置在堆栈中*,因此需要保存和检索它们。

      这不是 C 的做法:静态变量分配在堆栈外完全不同的内存段中,因此当函数结束其自动变量的范围时,它们不会被释放。

      通常,静态数据段在进入程序时会创建并初始化一次。之后,只要您的程序正在运行,该段就会保持分配状态。您的所有全局变量以及来自所有函数的静态变量都由编译器放置在此段中。这就是进入或离开函数对这些变量没有影响的原因。

      *“栈”的正式名称是“自动存储区”。

      【讨论】:

        【解决方案5】:

        考虑这个例子:

        static int foo;
        
        void f(void)
        {
            static int bar;
        }
        

        foobar 之间的唯一区别是 foo 具有文件范围,而 bar 具有函数范围。这两个变量在程序的整个生命周期中都存在。

        【讨论】:

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