3

我知道声明的变量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;
}
4

8 回答 8

2

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

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

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

于 2013-08-08T06:38:37.873 回答
1

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
x在 afunc()中,表示对象从第一次调用函数到程序结束都存在。

于 2013-08-08T03:26:20.583 回答
1

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

于 2013-08-08T01:40:32.923 回答
1

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

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

于 2013-08-08T04:26:15.347 回答
1

在此示例中添加int y到您的代码中的和y都可以使用(即可寻址)。main()func()

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

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

希望这可以帮助。

于 2013-08-08T02:21:45.973 回答
1

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

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

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

于 2013-08-08T03:08:11.240 回答
0

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

于 2013-08-08T01:43:15.817 回答
0

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

于 2014-02-21T18:21:53.213 回答