C语言 静态关键字static

一、静态全局变量与静态局部变量

       static是静态关键字。在全局变量前加上关键字static,该变量就被定义为静态全局变量。在局部变量前加上关键字static,该变量就被定义成一个静态局部变量。

       我们从可见性和生存期这两个方面谈论它们之间的区别。 对全局变量和函数加static,将会影响它的可见性,生存期不会受到影响。对局部变量加static,不会影响它的可见性,生存期却发生了改变。本文主要分析静态局部变量的特征。

二、静态局部变量的特征

       我们使用以下c语言代码实例方便我们进行分析 

#include<stdio.h>

void fun(int a)
{
    int x=0;
    static int Max=a;
    static int Min=10;
    ++x; ++Max; ++Min;
    printf("x=%d Max=%d Min=%d\n",x,Max,min);
}

int main()
{
    for(int i=10;i>0;--i)
    {
         fun(i);
    }
    return 0;
}

       以上程序运行的结果为 1     11    11;    1     12   12;   1    13   13……以此类推 。

       之所以会出现这种结果,是因为静态变量要放入描述表里去,当程序被加载(执行主程序之前),已经把min和max放入了数据区。min的值可直接放入数据区;max的值要函数第一次被调用时才能确定,和函数的形参有关。静态局部变量在函数第一次调用时执行,在以后调用中不执行。因此x每次都是从0开始,Max和Min却在变化。

       还有一个关键的问题是如何做到局部static语句只执行一次?

       答案是使用标志位,假如加的标志位为0,在第一次调用时发现标志位为0,把a给max,改变标志位,代表已经被初始化过。当然标志位的值不一定是0。

       我们还可以使用其他例子描述静态局部变量的特征,如下所示:

#include<stdio.h>

int * fun()
{
     static int a=10;
     return &a;
}

int main()
{
     int *p=fun();
     printf("%d ",*p);
     return 0;
}

       把a变量的地址能够返回给p的根本原因是函数结束了,局部变量还活着。能使用指针返回变量的地址,这个元素或者对象的生存期不受函数的影响。就不会出现指针失效的情况。

       如果把函数内的静态关键字static去掉,会发生错误,调用fun函数时给fun函数分配栈帧,return代表函数结束,分配给它的栈帧释放,p指针确实指向了a,但这块空间已经被释放了,这块地址很有可能会分配给其他函数,会造成其他函数的崩溃。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值