• C语言:static关键字的使用


    1.static修饰局部变量

    这是static关键字使用最多的情况。我们知道局部变量是在程序运行阶段在栈上创建的,但是static修饰的局部变量是在程序编译阶段在代码段(静态区)创建的。所以在static修饰的变量所在函数执行结束后该变量依然存在。

    1. //代码1
    2. #include
    3. void test()
    4. {
    5.    int i = 0;
    6.    i++;
    7.    printf("%d ", i);
    8. }
    9. int main()
    10. {
    11. int i = 0;
    12.    for(i=0; i<10; i++)
    13.   {
    14.      test();
    15.   }
    16.     return 0;
    17. }
    1. //代码2
    2. #include
    3. void test()
    4. {
    5.    static int i = 0;
    6.    i++;
    7.    printf("%d ", i);
    8. }
    9. int main()
    10. {
    11. int i = 0;
    12.    for(i=0; i<10; i++)
    13.   {
    14.      test();
    15.   }
    16.    return 0;
    17. }

    我们可以比较一下上面两段代码的运行结果,很容易发现代码1中的i每次打印的值都相同,代码2中的i每次打印的值都是之前的值加上1,所以代码1中的i每次都会在test函数运行结束时被销毁,而代码2中的i不会被销毁。

    需要注意的是:static int i=0这句代码作用于程序编译阶段,而程序运行阶段这句代码是不会产生任何效果的。为了验证这一点,我们可以进行如下操作:

    1. 使用这样的代码
      1. #include
      2. int main()
      3. {
      4. int j = 0;
      5. static int i = 0;
      6. return 0;
      7. }
    2. 进入调试模式
    3. 反汇编 这就是这段代码的汇编代码了,下面对这段汇编代码进行讲解

     因为这条语句无汇编代码,所以程序运行过程中直接无视这条语句。该语句作用于程序编译阶段,编译阶段在运行阶段之前,也就是说静态局部变量i在程序编译阶段就创建好了,在整个程序运行结束之后才会被销毁。所以,static关键字延长了局部变量的生命周期。

    2.static修饰全局变量

    同样的,经过static修饰的全局变量和局部变量一样,在程序编译阶段就会被分配内存

    未经过static修饰的全局变量具有外部链接属性,使用extern关键字即可以跨文件使用

    1. //代码1
    2. //add.c
    3. int g_val = 2018;
    4. //test.c
    5. int main()
    6. {
    7. extern int g_val;
    8.   printf("%d\n", g_val);
    9.   return 0;
    10. }
    11. //代码2
    12. //add.c
    13. static int g_val = 2018;
    14. //test.c
    15. int main()
    16. {
    17. extern int g_val;
    18.   printf("%d\n", g_val);
    19.   return 0;
    20. }

    运行这两段代码,我们发现代码1正常,代码2在编译的时候会出现连接性错误。;

    所以,经static修饰的全局变量的生命周期不变,作用域变小,只能够在本源文件内使用 

    延申: 在使用extern声明外部变量时不能设定初始值,但是可以在声明之后单独给该变量赋值。

    3.static修饰函数

    和static修饰全局变量十分类似,经过static修饰的函数的外部链接属性也被限制了,即只能在本源文件使用

    1. //代码1
    2. //add.c
    3. int Add(int x, int y)
    4. {
    5.   return x+y;
    6. }
    7. //test.c
    8. int main()
    9. {
    10.   printf("%d\n", Add(2, 3));
    11.   return 0;
    12. }
    13. //代码2
    14. //add.c
    15. static int Add(int x, int y)
    16. {
    17.   return x+y;
    18. }
    19. //test.c
    20. int main()
    21. {
    22.   printf("%d\n", Add(2, 3));
    23.   return 0;
    24. }

    运行两段代码,我们发现代码1正常,代码2在编译的时候会出现连接性错误。

    所以,一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。

  • 相关阅读:
    【C语言陷阱】00_scanf函数输入含空格时的陷阱
    2023年MathorCup数学建模D题航空安全风险分析和飞行技术评估问题解题全过程文档加程序
    MySQL-DML语句
    Postman(接口测试工具)
    java计算机毕业设计开放式教学评价管理系统源码+mysql数据库+系统+lw文档+部署
    SpringBoot@Profile详解
    基于Netty模拟大量WebSocket客户端
    React+Antd项目,Form的Input中已经有内容,但是还是提示此项为必填项,不能为空
    世界儿童日,周大福真诚关爱儿童成长
    vc websocket简单测试
  • 原文地址:https://blog.csdn.net/2201_75404212/article/details/132605756