作用域与生命周期
局部/全局变量、static 局部变量、变量的存储期
作用域与生命周期
变量的"可见范围"和"存活时间"是两个不同的概念。理解它们能避免很多奇怪的 bug。
学完本章你将: 掌握局部/全局/static 变量、块作用域、存储期。
局部变量(自动存储期)
c
#include <stdio.h>
void func() {
int x = 0; // 局部变量:进入函数创建,离开函数销毁
x++;
printf("%d\n", x);
}
int main() {
func(); // 1
func(); // 1(每次都重建)—— x 不会"记住"上次的值
func(); // 1
return 0;
}
静态局部变量(static)
c
void counter() {
static int count = 0; // 只初始化一次,值在函数调用间保留
count++;
printf("%d\n", count);
}
int main() {
counter(); // 1
counter(); // 2
counter(); // 3
}
💡
static局部变量存在程序的整个生命周期中,但作用域仍在函数内。适合实现"记住上次状态"的功能。
全局变量
c
int global = 100; // 全局变量:所有函数可见
void func1() { global++; }
void func2() { printf("%d\n", global); }
// ⚠️ 尽量少用全局变量——它让代码难以理解和测试
// 多文件时用 static 限制作用域到当前文件:
static int file_private = 0;
块作用域
c
int main() {
int x = 10;
{
int x = 20; // 遮蔽外层的 x
printf("%d\n", x); // 20
}
// 内层 x 已销毁
printf("%d\n", x); // 10
}