行业资讯
📅 2026/8/2 7:45:19
单片机/C/C++八股:(三十一)static 关键字的作用
上一篇下一篇static 关键字的作用static[adj] 静态的总结在最后面可直接看static变量称为静态存储类型的变量所谓静态就是变量在程序运行期间一直存在。static变量的特点如下在内存中以固定地址存放而不是以堆栈方式存放程序运行多次之后依然存放在同一地址存在.bss未初始化或初始化为0或.data已初始化为非0值段不在栈上只要程序没结束此变量就不会消失即使放在子函数中被反复调用每次调用的时候都会保留调用结束的值static修饰的全局变量/函数其他文件无法使用其他文件即使使用extern声明也无法访问该变量如果没有初始化那么静态变量的初始值默认是 0 。举例有如下程序#includestdio.hvoidfun(){inta10;a;printf(%d %p\n,a,a);}intmain(){inti0;while(i5){fun();i;}return0;}程序运行之后的结果为运行两次/* 第一次运行结果 */1100000063867ff90c1100000063867ff90c1100000063867ff90c1100000063867ff90c1100000063867ff90c/* 第二次运行结果 */110000002554dff7dc110000002554dff7dc110000002554dff7dc110000002554dff7dc110000002554dff7dc// 两次运行分配的地址都是不确定的现在将变量 a 定义为静态变量并且不初始化#includestdio.hvoidfun(){staticinta;a;printf(%d %p\n,a,a);}intmain(){inti0;while(i5){fun();i;}return0;}程序运行之后的结果为运行两次/* 第一次运行结果 */100007ff74fb4a000200007ff74fb4a000300007ff74fb4a000400007ff74fb4a000500007ff74fb4a000/* 第二次运行结果 */100007ff74fb4a000200007ff74fb4a000300007ff74fb4a000400007ff74fb4a000500007ff74fb4a000// 两次运行分配的地址都是固定的并且初始值为 0 1后才打印【总结】static关键字有三种用法定义静态局部变量使其生命周期延长到程序结束值会随着每次调用而改变存放地址未初始化或显示初始化为0存在 .bss段初始化为非0值则存在 .data 段不在栈上。定义静态全局变量限制作用域别的文件不可调用即使同一模块的 .c 和 .h 文件之间用extern也不行如key.c/key.h存放地址未初始化或显示初始化为0存在 .bss段初始化为非0值则存在 .data 段不在栈上。定义静态函数限制函数作用域别的文件不可调用即使同一模块的 .c 和 .h 文件之间用extern也不行如key.c/key.h和普通函数一样存放在代码段.text中。// 1. 静态局部变量staticintcount0;// 2. 静态全局变量staticintglobalVar;// 3. 静态函数staticvoidlocalFunc(void){}【注意】在 C 中结构体成员不可使用static定义C 中可以但结构体本身可以用static定义解释在C中成员只是结构体布局的一部分无独立存储而static是存储类说明符只适用于变量和函数不能用于成员。举例// 不可以成员不能是 staticstructS{staticintx;// 编译错误};// 可以结构体变量可以是 staticstaticstructSobj;在 C 中static 定义的变量必须使用 “编译时常量表达式” 进行初始化例如数字、字符、字符串字面量、NULL、sizeof表达式、取静态/全局变量的地址等编译时就能确定的值解释因为静态变量和全局变量在程序启动时main执行前就已经分配好内存并完成初始化此时整个运行时环境堆栈、函数调度等尚未就绪无法执行任何需要 CPU 运行的代码。错误行为举例// 严重错误intmain(){staticint*pmalloc(sizeof(int));*p20;free(p);pNULL;return0;}// 正确intmain(){staticint*pNULL;// p存放在.bss段if(pNULL){pmalloc(sizeof(int));// 运行时赋值完全合法}*p20;free(p);pNULL;return0;}不过一般不会用static来定义用于malloc的指针纯属突发奇想。