一、静态全局变量与静态局部变量
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,但这块空间已经被释放了,这块地址很有可能会分配给其他函数,会造成其他函数的崩溃。