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

标签 c static global-variables local-variables

我知道声明为 static 的变量只在声明它的文件中有范围,而声明没有 static 的变量可以从其他文件使用外部声明。

但是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;
}

最佳答案

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

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

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

关于c - 什么是静态全局变量目的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18116572/

相关文章:

c - 关于使用多个信号量进行同步

使用 gets 函数时代码块停止工作

c - .h 文件中全局变量的链接器错误

c - 全局变量似乎不占用任何内存空间

c - 汇编的 Linux 系统调用表或速查表

c - 如何将 Turbo-C 远指针分配和取消引用转换为 x86 程序集?

java - 返回类的静态实例

java - powermock可以用来测试静态方法吗

javascript - 静态私有(private)字段 Javascript

c - 如何在c中不使用全局变量