什么是作用域和生命周期?(static修饰变量)

微软技术分享 微软全球最有价值专家
全栈领域优质创作者
博客专家认证
2025-06-07 08:00:54

文章目录

作用域和生命周期

staticextern都是C语言中的关键字

static时静态的意思,可以用来:

  • 修饰局部变量
  • 修饰全局变量
  • 修饰函数

extern是用来声明来自外部符号符号: 变量,函数…)

https://i-blog.csdnimg.cn/direct/0bef10b1e6204cb199a11a9c479659c0.png

一、作用域和生命周期

1.作用域

  • 在讲解staticextern之前先讲述一下:作用域和生命周期
  • 作用域(scope)是程序设计的概念,通常来讲,一段代码中所运用到的名字并不总是有效(可用)的,而限定这个名字可用性的代码范围就是这个名字的作用域

​ 1.局部变量的作用域是变量所在的局部范围,其生命周期是其所在函数的生命周期

​ 2.全局变量的作用域是整个工程(项目)[全局范围],其生命周期是整个程序的生命周期


2.生命周期

  • 生命周期指的是从变量的创建(申请内存)到变量的销毁(收回内存)之间的一个时间段
  • 生命周期 其实就是一个变量从创建到被销毁的过程

​ 1.局部变量的 生命周期 是:进入作用域变量创建,生命周期 开始,出作用域,生命周期 结束(变量的创建 ---> 变量的销毁)

​ 2.全局变量的生命周期是:整个程序的生命周期

​ 3.程序的生命周期 == main函数的生命周期 == 全局变量的生命周期

  • 问题:这段代码的运行结果?

https://i-blog.csdnimg.cn/direct/df132966d1d44332b027c3394082634a.png

https://i-blog.csdnimg.cn/direct/8a3edc015a704a56ae93f9e0614578d6.png

  • 原因:test 是一个局部函数(它被定义在 main 函数内部),a是一个局部变量,当每次test开始执行时,局部变量a被创建,当test执行结束后,局部变量 a会被销毁(同时局部变量test也会自行销毁),以此反复

二、static修饰局部变量

  • static 修饰的对象,在编译阶段就会被创建
  • 存储位置:普通局部变量存储在栈区,函数调用结束后内存空间会被释放,而 static 修饰的局部变量存储在静态区,程序运行期间一直存在,不会因函数调用结束而被销毁。
  • 初始化:被**static修饰的局部变量只会在第一次执行到定义语句**时被初始化一次,后续函数调用不会再次初始化,且保留上一次函数调用结束时的值
  • 作用域与生命周期: static所修饰局部变量的作用域仍然是在定义它的函数内部,不能被其他函数直接访问。但由于其存储在静态区,其生命周期延长到整个程序运行期间,因此可以在多次函数调用期间保留数据(改变生命周期,但不会改变作用域(作用域仍在局部函数中),[因此其与全局变量不同])
C++
    #include<stdio.h>
    void test()
    {
        static int a = 0;//static修饰局部变量
        a++;
        printf("%d ", a);
    }
    int main()
    {
        for (int i = 0; i < 5; i++)
        {
            test();
        }
        return 0;
    }

https://i-blog.csdnimg.cn/direct/846b07ece5b743be8f5d2e4a7369720d.png

  • 总结:**static所修饰局部变量是改变了变量的生命周期生命周期改变的本质是改变了变量的存储类型a(栈区)--->static--->a[静态区],存储在静态区的变量与全局变量的生命周期同**,但作用域仍在局部函数test中

https://i-blog.csdnimg.cn/direct/66ebb534f1994fc896732e9f71a49d73.png

  • 使用建议:如果一个变量走出函数后,我们还想保留这个变量的值,就可以用到 static 来修饰

三、static修饰全局变量

  • 被**static修饰的全局变量,只能在本源文件内使用,而无法通过extern**(或其他途径)在其他源文件中使用。
  • 本质原因 全局变量默认是具有外部链接属性的,在外部文件中若想使用,只要适当的声明即可;但被static所修饰的全局变量,外部链接属性--->内部链接属性,只能在自己所在的源文件内部使用,其他源文件即使声明,也无法使用(类似于:**static** 将全局变量的作用域限制在了本源文件中
  • 使用建议:如果一个全局变量,只想在所在的源文件内部使用,而不想被其他外部文件所发现,就可以使用static修饰
  • 主文件中
C
    #include<stdio.h>    
    //声明来自外部的符号
    extern int g_val;
    int main()
    {
        printf("%d ", g_val);
        return 0;
    }
  • 外部add文件中
C
    int g_val = 1314;

https://i-blog.csdnimg.cn/direct/e63ff2de32d042458e21129cbc7829f0.png


  • 当外部全局变量 g_val 被staic修饰后:

https://i-blog.csdnimg.cn/direct/f69263e5d6e04fb88f2a00528db418d0.png


四、static修饰全局函数

  • 全局函数同样具备外部链接属性

https://i-blog.csdnimg.cn/direct/d4db7b58927f49fcbb35b0d03b85c419.png

https://i-blog.csdnimg.cn/direct/4eeb8bd600714161badd0f5437ce6045.png

https://i-blog.csdnimg.cn/direct/abbecc534ef040d3b9e7b10d81480d8b.png


同样的,被 static 修饰的全局函数:外部链接属性--->内部链接属性

https://i-blog.csdnimg.cn/direct/cc4f130917b34647b8a578635c3c90c2.png



文章来源: https://blog.csdn.net/2401_87692970/article/details/146464056
版权声明: 本文为博主原创文章,遵循CC 4.0 BY-SA 知识共享协议,转载请附上原文出处链接和本声明。


...全文
13 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

5,123

社区成员

发帖
与我相关
我的任务
社区描述
微软技术社区为中国的开发者们提供一个技术干货传播平台,传递微软全球的技术和产品最新动态,分享各大技术方向的学习资源,同时也涵盖针对不同行业和场景的实践案例,希望可以全方位地帮助你获取更多知识和技能。
windowsmicrosoft 企业社区
社区管理员
  • 山月照空舟
  • 郑子铭
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

微软技术社区为中国的开发者们提供一个技术干货传播平台,传递微软全球的技术和产品最新动态,分享各大技术方向的学习资源,同时也涵盖针对不同行业和场景的实践案例,希望可以全方位地帮助你获取更多知识和技能。

予力众生,成就不凡!微软致力于用技术改变世界,助力企业实现数字化转型。

试试用AI创作助手写篇文章吧