什么是全局变量?什么是局部变量?

全局变量 vs 局部变量

1. 全局变量(Global Variable)

  • 定义位置:在函数外部定义。
  • 作用域:从定义处开始,到整个程序结束均可访问。
  • 生命周期:程序启动时创建,程序结束时销毁。
  • 存储位置
    • 初始化过的全局变量 → .data
    • 未初始化的全局变量 → .bss(默认初始化为 0)。
  • 示例
    #include <stdio.h>
    int global_var = 10; // 全局变量(初始化)
    
    int main() {
        printf("%d\n", global_var); // 输出 10
        return 0;
    }
    

2. 局部变量(Local Variable)

  • 定义位置:在函数或代码块(如 {})内部定义。
  • 作用域:仅在其所在的函数或代码块内有效。
  • 生命周期:函数调用时创建,函数返回时销毁。
  • 存储位置栈(Stack),内容未初始化时为随机值。
  • 示例
    #include <stdio.h>
    void func() {
        int local_var = 20; // 局部变量
        printf("%d\n", local_var); // 输出 20
    }
    
    int main() {
        func();
        // printf("%d\n", local_var); // 错误!local_var 在此不可见
        return 0;
    }
    

关键区别

特性 全局变量 局部变量
定义位置 函数外部 函数或代码块内部
作用域 整个程序 仅限定义它的函数/代码块
生命周期 程序运行期间 函数调用期间
默认初始化 初始化为 0(未显式初始化) 未初始化时为随机值
存储区域 .data.bss 栈(Stack)

为什么未初始化的局部变量是随机的?

  • 栈内存由编译器动态管理,不会自动清零(为了效率)。
  • 局部变量的内存空间可能被之前其他函数使用过,残留数据即为“垃圾值”。
  • 示例
    #include <stdio.h>
    int main() {
        int x; // 未初始化的局部变量
        printf("%d\n", x); // 输出随机值(如 32767、0、-1等)
        return 0;
    }
    

如何选择?

  • 用全局变量
    需要跨函数共享数据,且生命周期覆盖整个程序运行时(慎用,易导致代码耦合)。
  • 用局部变量
    临时存储数据,避免命名冲突,提高代码模块化。

一句话总结

  • 全局变量:定义在函数外,全程序可见,默认初始化为 0
  • 局部变量:定义在函数内,仅局部可见,未初始化时值为随机。
posted @ 2025-07-01 16:55  f-52Hertz  阅读(54)  评论(0)    收藏  举报