尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

单片机/C/C++八股:(三十一)static 关键字的作用

单片机/C/C++八股:(三十一)static 关键字的作用
📅 发布时间:2026/8/2 7:51:30
上一篇下一篇

static 关键字的作用?

static:[adj] 静态的

总结在最后面!可直接看

static变量称为静态存储类型的变量,所谓静态就是变量在程序运行期间一直存在。

static变量的特点如下:

  • 在内存中以固定地址存放,而不是以堆栈方式存放(程序运行多次之后,依然存放在同一地址);
    • 存在.bss(未初始化或初始化为0)或.data(已初始化为非0值)段,不在栈上
  • 只要程序没结束,此变量就不会消失,即使放在子函数中被反复调用,每次调用的时候,都会保留调用结束的值;
  • static修饰的全局变量/函数,其他文件无法使用(其他文件即使使用extern声明,也无法访问该变量);
  • 如果没有初始化,那么静态变量的初始值默认是 0 。

举例,有如下程序:

#include<stdio.h>voidfun(){inta=10;a++;printf("%d %p\n",a,&a);}intmain(){inti=0;while(i<5){fun();i++;}return0;}

程序运行之后的结果为(运行两次):

/* 第一次运行结果 */1100000063867ff90c1100000063867ff90c1100000063867ff90c1100000063867ff90c1100000063867ff90c/* 第二次运行结果 */110000002554dff7dc110000002554dff7dc110000002554dff7dc110000002554dff7dc110000002554dff7dc// 两次运行,分配的地址都是不确定的

现在将变量 a 定义为静态变量,并且不初始化:

#include<stdio.h>voidfun(){staticinta;a++;printf("%d %p\n",a,&a);}intmain(){inti=0;while(i<5){fun();i++;}return0;}

程序运行之后的结果为(运行两次):

/* 第一次运行结果 */100007ff74fb4a000200007ff74fb4a000300007ff74fb4a000400007ff74fb4a000500007ff74fb4a000/* 第二次运行结果 */100007ff74fb4a000200007ff74fb4a000300007ff74fb4a000400007ff74fb4a000500007ff74fb4a000// 两次运行,分配的地址都是固定的,并且初始值为 0 (+1后才打印)

【总结】

static关键字有三种用法:

  1. 定义静态局部变量:使其生命周期延长到程序结束,值会随着每次调用而改变;
    • 存放地址:未初始化或显示初始化为0存在 .bss段,初始化为非0值则存在 .data 段,不在栈上。
  2. 定义静态全局变量:限制作用域,别的文件不可调用,即使同一模块的 .c 和 .h 文件之间用extern也不行(如key.c/key.h);
    • 存放地址:未初始化或显示初始化为0存在 .bss段,初始化为非0值则存在 .data 段,不在栈上。
  3. 定义静态函数:限制函数作用域,别的文件不可调用,即使同一模块的 .c 和 .h 文件之间用extern也不行(如key.c/key.h);
    • 和普通函数一样存放在代码段(.text)中。
// 1. 静态局部变量staticintcount=0;// 2. 静态全局变量staticintglobalVar;// 3. 静态函数staticvoidlocalFunc(void){}

【注意】:

  • 在 C 中,结构体成员不可使用static定义(C++ 中可以)!但结构体本身可以用static定义

    • 解释:在C中成员只是结构体布局的一部分,无独立存储;而static是存储类说明符,只适用于变量和函数,不能用于成员。

    • 举例:

      // 不可以:成员不能是 staticstructS{staticintx;// 编译错误};// 可以:结构体变量可以是 staticstaticstructSobj;
  • 在 C 中,static 定义的变量,必须使用 “编译时常量表达式” 进行初始化(例如数字、字符、字符串字面量、NULL、sizeof表达式、取静态/全局变量的地址等编译时就能确定的值)

    • 解释:因为静态变量和全局变量在程序启动时(main执行前)就已经分配好内存并完成初始化,此时整个运行时环境(堆栈、函数调度等)尚未就绪,无法执行任何需要 CPU 运行的代码。

    • 错误行为举例:

    // 严重错误intmain(){staticint*p=malloc(sizeof(int));*p=20;free(p);p=NULL;return0;}// 正确intmain(){staticint*p=NULL;// p存放在.bss段if(p==NULL){p=malloc(sizeof(int));// 运行时赋值,完全合法}*p=20;free(p);p=NULL;return0;}

    不过一般不会用static来定义用于malloc的指针,纯属突发奇想😄。


相关新闻

  • 3.52英寸电子墨水屏驱动全攻略:树莓派、Arduino、STM32跨平台实战
  • Claude模型参数传闻解读:从MoE架构到实战选型指南
  • SpringAI MCP-stdio协议实战:构建标准化AI工具集成方案

最新新闻

  • 2026年杜邦POM500P甄选指南:这7个应用场景为何值得优先考虑? - geo交流
  • 算法复杂度分析:大O、大Ω、大θ、小o、小ω的完整指南
  • 青岛中央空调维修-欧米到家金牌师傅全城区30分钟火速上门覆盖市南/市北/崂山/李沧等全域各区 专治不制冷/漏水/异响/跳闸
  • 测绘工程中的地形类别:从量化标准到智能分类的实战解析
  • ASI/SAGE供应商入驻全解析:硬性门槛、软实力与北美B2B市场准入指南
  • 不靠营销靠实力[特殊字符]Paperxie才是论文工具的全能天花板

日新闻

  • 怀化母婴除甲醛公司测甲醛中心怎么选:康之居母婴除甲醛标准、流程、避坑指南 - 信誉隆金银铂奢回收
  • 三步打造你的终极音乐中心:foobox-cn网络电台功能完整指南
  • Lance湖仓格式:为多模态AI工作流设计的终极数据存储方案

周新闻

  • 怀化母婴除甲醛公司测甲醛中心怎么选:康之居母婴除甲醛标准、流程、避坑指南 - 信誉隆金银铂奢回收
  • 三步打造你的终极音乐中心:foobox-cn网络电台功能完整指南
  • Lance湖仓格式:为多模态AI工作流设计的终极数据存储方案

月新闻

  • ClickHouse版本管理深度实战:4步构建零风险升级与回滚体系
  • Java 23 种设计模式:从踩坑到精通 | 番外:责任链模式 —— 物流审批流程实战
  • 华硕笔记本性能解放指南:G-Helper轻量级控制工具全面解析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号