『7x24小时有问必答』
  系统学习-全局变量与局部

人生就像一场马拉松,偶尔停下来摸摸鱼,才能走得更远

---

不知道大家有没有听过这句话:能局部不全局,这是写出好代码的关键。全局变量就是在整个程序中都能使用的变量。局部变量就是在某个段落或者某个涵数中使用的变量叫作局部变量。
打个比方

特性
全局变量
局部变量
比喻
作用域
整个程序可见
仅限于定义它的函数或代码块
公共客厅 vs 私人卧室
生命周期
程序运行期间始终存在
函数调用时创建,结束时销毁
永不熄灭的灯 vs 随用随开的灯
访问权限
所有函数均可访问
只有所在函数可以访问
谁都能用的会议室 vs 个人工位
线程安全
需要额外同步机制
天然线程安全
易冲突的共享资源 vs 独立的个人资源
将程序的作用域想象成一栋建筑中的不同房间

全局作用域就像大楼的大厅,所有人都可以进入的公共区域。放在大厅的物品(全局变量)可以被所有房间的人访问和修改,大厅的物品在建筑存在期间一直存在。

局部作用域作为独立房间每个房间是独立的封闭空间,只有进入房间的人才能看到和使用房间里的物品(局部变量)。房间外面的人无法看到房间内的物品,当所有人离开房间后,房间里的物品会被清理(变量销毁)

include  <stdio.h>

intglobalVar  =  100;   // 放在大厅的物品X = 100

voidroomA() {   // 进入房间A

intlocalVar_A  =  10;   // 房间A里的物品A = 10

      printf("Room A sees global: %d\n",  globalVar);   // 可以看到大厅的物品

      printf("Room A sees local: %d\n",  localVar_A);     // 可以看到房间A的物品

}

voidroomB() {   // 进入房间B

intlocalVar_B  =  20;   // 房间B里的物品B = 20

      printf("Room B sees global: %d\n",  globalVar);   // 可以看到大厅的物品

// printf("Room B sees A's local: %d\n", localVar_A);   // 错误!看不到房间A的物品

}

1.png
变量生命周期对比
在编程中,变量的生命周期(Lifecycle)指的是变量从创建到销毁的完整时间跨度。全局变量与局部变量在生命周期上存在根本性差异,理解这些差异对于编写高效、安全的代码至关重要。
特征
全局变量
局部变量
创建时机
程序启动时,main函数执行前
函数调用时
销毁时机
程序结束时
函数结束时   

  
存储位置
全局/静态区(数据段/BSS段)
栈区(函数栈帧)   

  
生命周期
整个程序执行期间
函数执行期间
初始化
自动初始化为0(未显式初始化时)
默认随机值(未初始化时)

初始化机制对比
全局变量

对于基本数据类型,如果初始化值为常量,在编译期就能确定
intglobalVar  =  100;     // 编译时就确定值

constdoublePI  =  3.14159;

局部变量初始化
intuninitializedVar;               // 未初始化,包含随机值

printf("%d",  uninitializedVar);  // 输出不可预测的值
使用未初始化的局部变量是危险的,可能导致程序错误。这个值是之前栈帧数据的残留,可能是任何值所以一般我们都这样做
intcounter  =  0;               // 显式初始化

charbuffer[100] = {0};     // 数组初始化

int*  ptr  =  NULL;               // 指针初始化

实际代码示例

// 全局变量 - 程序启动时创建

intglobalCounter  =  0;               // 存储在数据段

staticintstaticGlobal  =  100;   // 静态全局变量

voidprocessOrder(int  orderId) {

// 局部变量 - 函数调用时创建

intlocalOrderId  = orderId;   // 存储在栈上

staticintstaticLocal  =  0;   // 静态局部变量

localOrderId++;                     // 修改局部变量

staticLocal++;                       // 修改静态局部变量

globalCounter++;                    // 修改全局变量

printf("订单处理 - 本地订单ID: %d\n",  localOrderId);

printf("订单处理 - 静态局部变量: %d\n",  staticLocal);

printf("订单处理 - 全局计数器: %d\n",  globalCounter);

// 函数结束,localOrderId销毁,staticLocal继续存在

}

intmain() {

printf("程序启动,全局变量已初始化:\n");

printf("全局计数器初始值: %d\n",  globalCounter);

printf("静态全局变量: %d\n\n",  staticGlobal);

// 多次调用函数,观察变量生命周期差异

processOrder(1001);

processOrder(1002);

processOrder(1003);

printf("\n程序结束,全局变量即将销毁\n");

return0;

}

输出结果分析

程序启动,全局变量已初始化:
全局计数器初始值:  0
静态全局变量:  100

订单处理 - 本地订单ID:  1002  (每次都是新变量)
订单处理 - 静态局部变量:  1 → 2 → 3  (持续累加)
订单处理 - 全局计数器:  1 → 2 → 3  (持续累加)

观察:局部变量localOrderId每次调用都重新创建;静态局部变量staticLocal和全局变量globalCounter在整个程序生命周期中持续存在并累加
总结
记住,最好的代码不是最复杂的代码,而是最简单、最清晰、最容易理解的代码。全局与程序同寿,局部随函数调用创建/销毁。遵循“能局部不全局”原则,减少耦合风险

---

授人以鱼不如授人以渔

2.webp

喜欢就给个点赞+在看
3.gif
</stdio.h>

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码