C语言全局变量与局部变量的存储 一句话总结全局变量住“永久套房”局部变量住“临时钟点房”一、先看代码#include stdio.h int global_a 10; // 全局变量 int global_b; // 未初始化的全局变量 void func() { int local_c 20; // 局部变量自动变量 static int static_d 30; // 静态局部变量特殊 printf(%d %d\n, local_c, static_d); } int main() { int local_e 40; // 局部变量 func(); return 0; }二、存储在哪里内存分区变量类型存储区域特点全局变量已初始化数据段.data程序一开始就分配直到程序结束才释放全局变量未初始化BSS段.bss同上但默认初始化为0静态局部变量static数据段 / BSS段生命周期同全局但作用域仅在函数内局部变量普通栈stack函数调用时分配函数返回时自动释放局部变量用malloc堆heap手动分配/释放但这不是变量本身是指针指向的内存日常写代码我们最关心的是 栈 和 数据段。三、生命周期 vs 作用域容易混淆生命周期变量在内存中存在的时间。全局变量从程序开始到结束永生局部变量从函数调用开始到返回瞬间作用域变量在代码中能被访问的范围。全局变量整个文件甚至其他文件用 extern局部变量仅限所在函数或代码块 { }例子int g 100; void test() { int l 200; printf(%d\n, g); // 可以访问全局 printf(%d\n, l); // 自己的局部 } int main() { // printf(%d\n, l); // 错误l 只在 test 里有效 printf(%d\n, g); // 全局随时可访问 }四、初始化规则记住差异变量类型若不初始化默认值全局变量0静态局部变量0普通局部变量随机值垃圾值所以局部变量一定要手动赋初值否则可能出 bug。五、内存大小与栈溢出小提醒全局变量存放在静态区大小受限于程序总内存。局部变量在栈上栈空间通常较小几MB不要定义大数组在局部void bad() { int big[1000000]; // 可能栈溢出 }大数组建议全局或 static或者用 malloc 放堆上。六、总结对比表特性全局变量静态局部变量普通局部变量存储区域数据段/BSS数据段/BSS栈生命周期整个程序整个程序函数调用期间作用域整个文件仅函数内仅函数内默认初始值00随机多线程安全需小心需小心线程独立每调用一次新栈帧七、一个小彩蛋同名变量时局部优先int x 10; void func() { int x 20; printf(%d\n, x); // 输出 20局部覆盖全局 }想访问全局变量可以用 ::xC或通过指针但 C 中没这语法只能避免同名。最后一句全局变量方便但占用常驻内存局部变量高效但“用完即走”。根据需求选择合适的存储类别写出健壮的程序如果你觉得有帮助欢迎点赞、收藏、评论让更多人看到