编程语言入门/静态内存
外观
< 编程语言入门
当程序员声明一个全局变量,例如 `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` 的变量,但它们是不同的变量。这足以表明静态变量的作用域不是全局的,正如我们从它们的 رفتار 可能会想到的那样。