#include <stdio.h>
int x_a = 0;
void func(void) {
static int x_b = 0;
int x_c = 0;
printf("%3d %3d %3d\n", x_a ++, x_b++, x_c++);
}
int main(void) {
int i;
puts(" ax sx fx");
puts("------------");
for (i = 0; i < 10; i++) {
func();
}
return 0;
}
运行结果:
x_c = 0是因为 当函数func执行结束的时候变量x_c就消失了。它的变量寿命只在func函数体中存在,每次调用函数结束后 x_c 会自动消失,所以x_c++ 不会增加该变量的值。
总结:
自动存储期 | 静态存储期 | |
---|---|---|
生成 | 程序执行到对象声明的时候创建出相应的对象 | 在程序执行开始执行的时候被创建出来 |
初始化 | 如果不显示地进行初始化,则该对象会被初始化为不确定的值 | 如果不显示地进行初始化,则该对象会被初始化为0 |
消失 | 执行到包含该声明的程序块的结尾时,该对象就会消失 | 在程序结束的时候消失 |
自动存储期:
在函数中不适用存储类说明符 static 而定义出的变量,被赋予了自动存储期,它具有以下特性。
- 程序执行到对象声明的时候就创建除了对应的对象。而执行到包含该声明的程序块的结尾,也就是大括号}的时候,该对象就会消失。
- 该对象拥有短暂的寿命,如果不对该变量进行初始化,则该对象会被初始化为不确定的值。
静态存储期:
在函数中使用static定义出来的对象,或者在函数外声明定义出来的对象都被赋予了静态存储期,它具有以下特性。
- 在程序开始执行的时候,具体地说是在 main 函数执行之前的准备阶段被创建出来,在程序结束的时候消失。
- 该对象拥有 “永久”的寿命,如果不对该变量进行初始化,则该对象会自动初始化为0.