Z
ZHANK
编程在线教程C 语言教程作用域与生命周期
函数

作用域与生命周期

局部/全局变量、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
}