对静态变量的困惑

标签 c static

我对静态整数的概念感到困惑。当我在主函数中初始化静态整数时,即

static int i;

现在静态整数被赋值为 0。下一步:

i++;

我变成了 1。

现在程序终止。我想知道下一次运行时会生成什么程序。另外,如果关闭整个程序会怎样?我知道第一行是 static int i;因此,下一次运行该函数时的下一个值应保留 i 先前运行时的值。如果是这样,将变量设为静态有什么好处?变量有时间限制还是可以永久保存?如果我再次运行该函数,值会是多少?

最佳答案

在 C 中,“静态”意味着变量在全局存储中具有局部作用域。

C 中变量的作用域是一个 block 。换句话说,变量可以在它们声明的 block 内使用。通常他们只是保持他们的值(value)直到区 block 结束,之后就丢失了。示例:

{
   int a; 
   // Only a can be used here
   {
      int b;
      // a and b can be used here
      {
         int c;
         // a,b and c can be used here
      }
      //just a and b can be used here. c is not available anymore
    }
    // only a can be used here. Neither b nor c are available anymore
 }

除了可以在整个程序中使用的全局变量外,这是正确的。

另一个异常(exception)是静态变量。它仅在 block 内可见,但在 block 结束后保持其值。

这意味着如果您在函数内声明一个静态变量,它将在函数调用之间保持其值。

例如,下面的函数有一个局部变量。局部变量具有 block 范围(这意味着您只能在声明的 block {} 内访问变量“var”,在下面的情况下是在函数内):

void countFunction(void)
{
  int var = 0;
  var = var + 1;
  printf("Value is %d\n", var);
}

一旦变量不是静态的,每次调用函数时它都会打印“Value is 1”,因为变量存储在函数调用时分配的堆栈中,并在函数返回后释放。

如果您将 var 更改为静态的,

void countFunction(void)
{
  static int var = 0;
  var = var + 1;
  printf("Value is %d\n", var);
}

第一次调用该函数时,var 将被初始化为 0,该函数将显示“Value is 1”。然而,在第二次时,var 将已经分配并位于全局区域。不会再次初始化,函数会显示“Value is 2”。

这在程序执行中。

虽然只要您的程序执行就会分配一个静态变量,但在您的程序完成后它不会保留其值(程序将释放其所有内存)。为下次运行保留任何值的唯一方法是将其存储在磁盘等非 volatile 介质中。

希望对您有所帮助。

关于对静态变量的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3324321/

相关文章:

c++ - 如何将 JPEG 注释添加到现有的 JPEG 图像文件

c - 日志记录与 logrotate 兼容

c++ - 是什么让静态变量只初始化一次?

python - 如何在 Python 中使用类变量作为默认参数值

c - sed 执行失败

c - 给定一个正整数,判断它是否等于四个连续整数之和

c - 包含 unistd.h 的 write() 的包装例程导致错误

php - 如何解决创建多个静态页面的问题

java - Activity 类中的静态字段是否保证比创建/销毁周期更长?

java - 即使我将 1 个数组的值存储到另一个数组中并将它们作为一个整体打印,但数组仍然打印最后一个值