跳转到内容

编程语言入门/静态内存

来自维基教科书,开放的书籍,开放的世界

静态内存

[编辑 | 编辑源代码]

当程序员声明一个全局变量,例如 `global_var`、`global_const` 或 `global_const2` 时,它们可以进入数据bss部分,具体取决于它们是否被初始化。如果它们被初始化了,它们会进入数据部分。如果没有,它们会进入bss部分。静态变量的工作方式与全局变量相同:它们会进入数据bss部分,具体取决于它们的初始化情况。

请注意,这些段的大小在编译时是已知的。数据bss之间的唯一区别是初始化。还需要指出的是,由编译器初始化为零的全局变量和静态变量会进入bss。因此,`static_var_u` 会进入bss,而 `static_var` 会进入数据


静态变量的作用域

[编辑 | 编辑源代码]

静态变量的行为几乎与全局变量相同:虽然局部变量在每次函数退出时会丢失其值,但静态变量会跨函数调用保留其值。以下程序展示了这种行为。


#include <stdio.h>

int counter1() {
  static store = 0;
  store++;
  printf("Counter 1 = %d\n", store);
  return store;
}

int counter2() {
  static store = 0;
  store++;
  printf("Counter 2 = %d\n", store);
  return store;
}

int main() {
  int i;
  char* s = "Counter = ";
  for (i = 0; i < 5; i++) {
    if (i % 2) {
      counter1();
    } else {
      counter2();
    }
  }
}


运行上面的程序,我们看到,尽管有两个名为 `store` 的变量,但它们是不同的变量。这足以表明静态变量的作用域不是全局的,正如我们从它们的 رفتار 可能会想到的那样。

华夏公益教科书