C语言 什么是静态全局变量用途



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

但是"全局"static是使变量保留最后一个分配的值,这是真的吗?喜欢静态的局部目的吗?

#include <stdio.h>
void func() {
  static int x = 0; // x is initialized only once across three calls of func()
  printf("%dn", 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;
}

术语"保持最后一个值"会给您带来困惑。术语"维护最后一个值"将用于函数局部变量与函数静态变量的上下文。因为在函数中声明的变量存储在堆栈中,并且在退出函数时将被清除该函数使用的堆栈,从而使变量失效。

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

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

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

在此

示例中已将int y添加到您的代码中y该代码可从main()func()使用(即可寻址(。

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

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

希望这有帮助。

在函数的范围内,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,都不起作用。文件中的任何函数仍然可以提供指向此变量的指针,指向调用它的任何函数,但变量名称对任何外部代码都不可见。

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

global static variables具有static初始化。只能在创建它的文件中访问它们。如果不为它们值,它们将被初始化为 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("%dn", 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()内,表示对象从第一次调用函数到程序结束就存在。

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

全局静态变量是只能在创建它的文件中访问的变量。此变量称为具有文件范围。

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

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

相关内容

  • 没有找到相关文章

最新更新