【问题标题】:What is the Static Global Variable Purpose?静态全局变量的用途是什么?
【发布时间】:2013-08-08 01:34:43
【问题描述】:

我知道声明 static 的变量仅在声明它的文件中具有范围,而没有声明 static 的变量可以使用 extern 声明从其他文件访问。

但是static“全局”是不是真的是让变量保留上次赋值的值。喜欢静态本地目的?

#include <stdio.h>

void func() {
  static int x = 0; // x is initialized only once across three calls of func()
  printf("%d\n", x); // outputs the value of x
  x = x + 1;
}

int main(int argc, char *argv[]) {
  func(); // prints 0
  func(); // prints 1
  func(); // prints 2
  return 0;
}

【问题讨论】:

    标签: c static global-variables local-variables


    【解决方案1】:

    “保持最后的价值”这个术语让您感到困惑。术语“保持最后一个值”将用于函数局部变量与函数静态变量的上下文。因为在函数中声明的变量存储在堆栈中,并且在退出函数时将清除该函数使用的堆栈,从而使变量死亡。

    但是使用静态创建函数局部变量是在 RAM(而不是堆栈)中创建内存,即使在函数退出后也允许内存保持。甚至全局变量和文件静态变量都存储在 RAM 中,从而永久保留其值。

    因此,对于您的问题,存储在 RAM 中的任何变量都将“保持其最后一个值”,而不管其关键字 static。但是静态限制了它的使用范围,即,如果在文件范围内声明,则可以在文件内使用(访问),如果在函数范围内声明,则其范围仅限于函数内。

    【讨论】:

      【解决方案2】:

      第一次调用函数 func 时,x 将被初始化为零。 但是从下一次调用 func 开始,不会调用 x = 0,因为 x 已经初始化。

      【讨论】:

        【解决方案3】:

        在此示例中已将int y 添加到您的代码中,y 可从main()func() 获得(即可寻址)。

        请注意,我没有在您的程序中添加任何其他代码,有些人会指出,如果实际编译 y 可能会被标记为未使用。但是对于本次讨论,mainfunc 都可以设置和引用y

        如果您可以避免使用全局变量,那么就这样做,但在 C 中它们可能很有用。 K&R 讨论了这一点。

        希望这会有所帮助。

        【讨论】:

          【解决方案4】:

          在函数的范围内,static 初始化器都是关于持续时间的。该变量仅在第一次调用函数时或之前初始化一次,(如果代码未指定初始化值,则使用 0NULL 或适当的等效项初始化变量。之后,变量在程序运行期间继续存在。标识符的范围仅限于函数,但变量本身继续存在,因此返回指向它的指针是有效的,否则会是非法。(“标识符的范围”是变量本身的名称。如果您有一个名为“gimme_a_string”的函数并且在该函数中您有static char my_str[20],则名称只有my_str存在于函数内部,但 20 字节数组始终存在。)

          在函数范围之外(“在文件范围内”),您声明的任何变量都将具有与程序完整运行相同的持续时间。在这种情况下,声明变量static 会影响所谓的链接。如果在文件范围内声明static int my_flags,则任何其他“翻译单元”都无法看到变量名称my_flags。您的程序或任何库中的任何其他源文件,如果试图通过说extern int my_flags 来获取您的my_flags,将无法正常工作。文件中的任何函数仍然可以将指向该变量的指针指向调用它的任何函数,但变量名对任何外部代码都不可见。

          THEREFORE:您的问题的答案是“不,在文件范围内,将变量声明为 static 具有使变量保留最后分配的值,就像它在函数范围内一样。任何文件范围的变量都将具有该属性,将其声明为 static 只是对其他翻译单元隐藏符号。"

          【讨论】:

            【解决方案5】:

            global static variablesstatic 初始化。它们只能在创建它的文件中访问。 如果您不为它们分配值,它们将被初始化为0
            此外,如果 全局变量 在函数之外定义,则它们的范围从定义它们的位置开始,一直持续到文件末尾。

            local static variable是一个变量,可以从一个函数调用到另一个函数保持其值,并且会一直存在到程序结束。

            #include <stdio.h>
            int global_var;
            static int static_var;
            void func() {
             static int x = 0; // x is initialized only once across three calls of func()
             printf("%d\n", x); // outputs the value of x
             x = x + 1;
            }
            
            int main(int argc, char *argv[]) {
            func(); // prints 0
            func(); // prints 1
            func(); // prints 2
            
            return 0;
            }
            

            global_varstatic_var 在程序运行时的值为0
            当程序结束时,它们的值仍然是0
            xfunc() 中,表示该对象从第一次调用函数到程序结束都存在。

            【讨论】:

              【解决方案6】:

              局部静态变量是一个变量,可以在一个函数调用到另一个函数时保持其值,并且会一直存在到程序结束。创建局部静态变量时,应该为其分配一个初始值。如果不是,则该值将默认为 0。

              全局静态变量是只能在创建它的文件中访问的变量。据说这个变量有文件范围。

              【讨论】:

                【解决方案7】:

                静态全局和静态局部之间的区别主要在于“正常”全局和“正常”局部之间的区别。 您不能在声明它的函数之外访问静态局部变量,但在定义静态全局变量的文件中的所有函数中都可以访问静态全局变量。

                【讨论】:

                • 不,我认为你错了,静态全局变量对于定义它们的源文件是私有的,并且不会与其他同名的源文件中的其他变量冲突,静态的怎么可能全局可在所有功能中访问?
                • 哎呀..!!我的意思是文件中的函数..“不是全部”...感谢您指出这一点... :)
                【解决方案8】:

                模块静态和全局(外部)变量之间的主要区别是静态局部变量存储在 RAM 的 LI_1 区域,而全局变量存储在 RAM 的 PUBLIC 区域。因此,全局变量可以从其他模块访问,而静态变量则不能。除此之外,对于同一模块,两者的行为方式相同。两者都将被初始化为零并保留该值。

                【讨论】:

                • 本题为纯C语言题。这些“LI_1”和“PUBLIC”“区域是什么?
                • 这个问题是C语言问题我同意。但这只是为了说明变量是如何存储在内存区域中的。 LI_1 和 PUBLIC 与程序集级别有关。此信息可能对对嵌入式 C 编程感兴趣的人有用。
                猜你喜欢
                • 2020-12-17
                • 2010-09-25
                • 1970-01-01
                • 2015-06-12
                • 1970-01-01
                • 2022-01-28
                • 1970-01-01
                • 2023-03-22
                • 1970-01-01
                相关资源
                最近更新 更多