分享

Stastic 局部变量与Auto 局部变量说明

 Aaronwy 2012-03-27

第七章 函数

[学习指导] [本章练习] [知识点] [参考文献]

7.6.3 static局部变量
在局部变量前面加关键字static进行声明,该变量就是一个static局部变量。static局部变量的特点是它位于静态存贮区,在函数调用结束后,它的值仍然存在,并可能影响到下一次调用的过程。下面用一个简单的例子来说明:
int f(int i)
{
int a=0;
static int c=1;
c=c+i;
return c;
}
main()
{
printf("%d\n",f(1));
printf("%d\n",f(1));
}
程序运行的结果为
2
3
main函数两次调用了函数f,得到了不同的返回值。
在这段程序中,static int c=1;定义了静态局部变量c并将它初始化为1。由于c是静态变量,保存在静态存贮区,程序开始运行时c就存在,也就是说static int c=1在程序运行时就已经执行完毕;程序执行每次函数f的调用,进入f函数后,static int c=1这条定义并不起作用。
与之不同的是,变量a属于auto型变量,每次函数调用进入f后,在动态存贮区为a分配内存并初始化为0,函数调用结束后,a的内存被释放。
下面分析一下程序的执行过程:
(1)程序开始后,首先为int型变量c在静态存贮区里分配内存,并赋初值1;
(2)程序进入main函数后,执行第一个printf语句,首次调用函数f,将实际参数1传递给f的形式参数i;
(3)程序进入函数f后,为变量a动态分配内存,但由于c是静态变量,因此跳过static int c=1的定义,执行c=c+i,结果c被重新赋值为2;
(4)函数返回2,主程序打印输出2。注意用于c是静态变量,函数返回后它仍然存在,值为2。
(5)程序执行第二个printf语句,再次调用函数f,仍然传递1给i;
(6)进入函数后,c的值是上次调用后的2,因此执行c=c+i后被赋值为3,函数返回3,主程序打印输出3;
(7)程序结束,释放静态变量c。
从上面的例子可以看到,static局部变量是一种比较特殊的变量。从作用域来看,它是一种局部变量,因此它的作用域只能是当前的函数,也就是说,只能在当前函数内使用这个局部变量,其他函数不能引用它;但是,static局部变量存放在静态存贮区,它的生存期比较长,从程序开始运行它就开始存在,待程序结束后它被释放,从这个意义上说,它具有类似全局变量的效果。
static局部变量和auto局部变量的另一个不同是对初值的处理。如果一个auto变量在定义时没有赋初值,那么它是一个随机值;static局部变量如果没有赋初值,编译器将自动将其赋值为0(对于数值型变量)或空字符(对于字符型变量)。
利用static局部变量的特点,可以保存上次函数调用的某些结果,下面的例子利用static局部变量做累加,计算1+2+3+...+100的结果:
Add(int a)
{
static int r=0;
r+=a;
return r;
}
main()
{
int i, sum;
for(i=1;i<=100;i++)
sum=Add(i);
printf("%d",sum);
}
程序运行的结果是:
5050
一般来说,在程序中尽量不用或少用static局部变量。原因主要有:
(1)static局部变量的生存期长,比较浪费内存;
(2)使用static局部变量会导致函数的多次调用之间发生联系,使代码的可读性降低。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多