什么是静态全局变量目的?

时间:2013-08-08 01:34:44

标签: c static global-variables local-variables

我知道声明为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;
}

8 个答案:

答案 0 :(得分:2)

“维持最后价值”一词会给您造成混淆。术语“保持最后一个值”将用于函数局部变量与函数静态变量的上下文。因为在函数内声明的变量存储在堆栈中,并且在退出函数时将清除该函数使用的堆栈,该函数使变量死亡。

但是使用static创建一个函数局部变量是在RAM中创建一个内存(而不是在堆栈中),这样即使在函数退出后内存仍然可以保存。甚至全局变量和文件静态变量都存储在RAM中,从而永远保留其值。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

在此示例中为int y添加了y main()可用(即可寻址)func()y

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

如果您可以避免使用Global Var,那么这样做,但在C中它们可能很有用。 K&amp; R讨论了这一点。

希望这有帮助。

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:1)

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("%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 x内的func()表示从第一次调用函数到程序结束时对象存在。

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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