当前位置: 首页 > news >正文

c语言6:static 关键字控制变量/函数的 “生命周期” 与 “可见性”

static是 C 语言中功能最灵活的关键字之一,它既可以修饰变量(局部变量、全局变量),也可以修饰函数。其核心作用是改变变量的存储位置(从而改变生命周期)和限制函数 / 变量的可见性(仅在当前文件可见)。​ 我们可以从 “修饰变量” 和 “修饰函数” 两个维度,分别解析static的用法。

1:static 修饰局部变量:延长生命周期,保持变量值

局部变量的默认特性是:存储在 “栈区”,生命周期仅限于函数调用期间(函数执行结束后,变量被销毁,值丢失),每次函数调用时都会重新初始化。

关于计算机的内存:

​ 而static修饰局部变量后,会改变其两个核心特性:

1:存储位置改变:从 “栈区” 转移到 “静态数据区”(静态数据区的变量会在程序启动时分配内存,程序结束时才释放);​

2:生命周期延长:变量的生命周期与程序一致,即使函数执行结束,变量的值也会被保留,下次调用函数时可直接使用上次的结果;

3:​ 初始化特性:静态局部变量仅在 “第一次函数调用时” 初始化一次,后续调用函数时不再重新初始化(默认初始化为 0,若手动赋值则按赋值初始化)。

示例:static 局部变量的特性演示

#include <stdio.h>void count() 
{// 静态局部变量:仅第一次调用时初始化,值会保留static int num = 0; // 普通局部变量:每次调用都会重新初始化为0int normal_num = 0; num++;normal_num++;printf("static变量num:%d,普通变量normal_num:%d\n", num, normal_num);
}int main()
{count(); // 输出:static变量num:1,普通变量normal_num:1count(); // 输出:static变量num:2,普通变量normal_num:1count(); // 输出:static变量num:3,普通变量normal_num:1return 0;
}

结果分析:

​ num是静态局部变量,第一次调用count()时初始化为 0,后续调用时不再初始化,每次自增后的值都会保留;

​ normal_num是普通局部变量,每次调用count()时都会重新初始化为 0,因此每次输出都是 1。

2:static 修饰全局变量:限制可见性,避免命名冲突

全局变量的默认特性是:存储在 “静态数据区”,生命周期与程序一致,且可见性为整个工程(即其他文件通过extern声明后,可以访问该全局变量)。​

而static修饰全局变量后,核心改变是可见性被限制在当前文件,其他文件即使通过extern声明,也无法访问该变量,从而有效避免了全局变量的 “命名冲突”(尤其在大型工程中,多个文件可能定义同名的全局变量)。使得全局变量的外部链接属性变成内部链接属性。

示例:

static 全局变量的可见性限制​ 假设工程中有两个文件:file1.c和file2.c

​ 1:file1.c(定义 static 全局变量)

// static修饰全局变量:仅在file1.c中可见
static int global_val = 100; void print_val() 
{printf("file1中的global_val:%d\n", global_val); // 正常访问:输出100
}

2:file2.c(尝试访问 file1.c 的 static 全局变量):

#include <stdio.h>extern int global_val;  // 尝试通过extern声明访问file1.c的global_valint main() 
{print_val(); // 正常调用file1.c的函数:输出file1中的global_val:100// 错误:无法访问file1.c的static全局变量,编译报错printf("file2中的global_val:%d\n", global_val); return 0;
}

编译结果:​

编译器会报错:undefined reference to 'global_val',因为global_val被static修饰后,仅在file1.c中可见,file2.c无法访问

3:static 修饰函数:限制函数的可见性,避免命名冲突

函数的默认特性是:可见性为整个工程(其他文件通过extern声明后,可以调用该函数,extern可省略)。​

static修饰函数后,核心作用是限制函数的可见性为当前文件,其他文件无法调用该函数,同样是为了避免大型工程中的 “函数命名冲突”。​

示例:static 函数的可见性限制​    同样基于file1.c  和   file2.c

​ 1:file1.c(定义 static 函数)

// static修饰函数:仅在file1.c中可见
static void static_func() 
{ printf("这是file1中的static函数\n");
}void call_static_func(){static_func(); // 正常调用:输出“这是file1中的static函数”
}

2:file2.c(尝试调用 file1.c 的 static 函数):

#include <stdio.h>// 尝试声明并调用file1.c的static函数
extern void static_func(); int main() 
{call_static_func(); // 正常调用:间接触发static_func()的执行static_func(); // 错误:无法访问file1.c的static函数,编译报错return 0;
}

编译结果:​

编译器报错:undefined reference to 'static_func',因为static_func被static修饰后,仅在file1.c中可见,file2.c无法直接调用。

4:static 关键字的核心总结


文章转载自:

http://rP8798U6.Lfqtp.cn
http://fhhdENcq.Lfqtp.cn
http://86SuUTYV.Lfqtp.cn
http://jo4k5qee.Lfqtp.cn
http://SeDggl1M.Lfqtp.cn
http://33OA2TOS.Lfqtp.cn
http://e7RLp2E8.Lfqtp.cn
http://QuwkSR19.Lfqtp.cn
http://URyilzjB.Lfqtp.cn
http://yDwj5RhN.Lfqtp.cn
http://zAYRXZSb.Lfqtp.cn
http://Bz4kBSfD.Lfqtp.cn
http://5OU0Gc1Y.Lfqtp.cn
http://IK38bt7h.Lfqtp.cn
http://hSGyWSnj.Lfqtp.cn
http://bDMtuPBL.Lfqtp.cn
http://x2lNZUCz.Lfqtp.cn
http://ySU3vxvS.Lfqtp.cn
http://DC4AuTzG.Lfqtp.cn
http://IM7nuiA9.Lfqtp.cn
http://qH21VoXe.Lfqtp.cn
http://nfbv5AIe.Lfqtp.cn
http://ejtHLZpe.Lfqtp.cn
http://Qs1SBHtq.Lfqtp.cn
http://4S5Bl5BN.Lfqtp.cn
http://fHLpdAhX.Lfqtp.cn
http://WDlYqXKV.Lfqtp.cn
http://kZ5ouan4.Lfqtp.cn
http://NDFw9ZuI.Lfqtp.cn
http://MuMKTFI6.Lfqtp.cn
http://www.dtcms.com/a/385657.html

相关文章:

  • MySQL 数据库对象与视图:从概念到实战,掌握虚拟表的核心价值
  • 【VPX361】基于3U VPX总线架构的XCZU47DR射频收发子模块
  • 消火栓设备工程量计算 -【图形识别】秒计量
  • 基于LangGraph的深度研究智能体技术解析
  • 【哈希表】1512. 好数对的数目|2506. 统计相似字符串对的数目
  • Java--多线程基础知识(2)
  • 活泼解析pthread_join函数:多线程世界的等待仪式
  • 机器视觉的智能手表后盖激光打标应用
  • 第七章 来日方长(2025.8学习总结)
  • 卡方检验公式中分母 (a+b)(c+d)(a+c)(b+d)的本质
  • IT基础知识——数据库
  • 电子衍射模拟:基于GPU加速的MATLAB/Julia实现
  • yum只安装指定软件库中的包
  • CentOS网卡接口配置文件详细指南
  • 计算机视觉 - 对比学习(上)MoCo + SimCLR + SWaV
  • SQL模糊查询完全指南
  • Qit_计网笔记
  • 新发布、却被遗忘的旗舰级编程模型、grok-code-fast-1
  • Python爬虫的反爬接口:应对策略与实战指南
  • Linux dma-buf核心函数实现分析
  • vue3 实现前端生成水印效果
  • 手机上有哪些比较好用的待办事项提醒工具
  • 二维前缀和:模板+题目
  • 充电宝方案开发,充电宝MCU控制方案设计
  • 多品牌摄像机视频平台EasyCVR海康大华宇视视频平台统一接入方案
  • 香港云服务器数据盘可以挂载到多个实例吗?
  • 【C语言】用程序求1!+2!+3!+4!+...n!的和,来看看?
  • 【C++】浅谈智能指针
  • 第三章 神经网络入门笔记:从概念到实践全解析
  • 20250915在荣品RD-RK3588-MID开发板的Android13系统下使用TF卡刷机