原代码如下
#include<stdio.h>
func(int a,int b){
static int m,i=2;
printf("%d\n",i);
i+=m+1;m=i+a+b;
printf("%d,%d\n",i,m);
return(m);
}
int main()
{
int k=4,m=1,p;
p=func(k,m);
printf("%d\n",p);
p=func(k,m);
printf("%d",p);
return 0;
}
静态局部变量的特点:作为局部变量在函数或复合语句内定义,在函数或复合语句之外的区域内不存在(可以把每个定义的函数或者复合语句看成一个区域,每个区域有自己的内存空间,出了这个区域后其中的变量不会出现在其他区域,全局变量除外,这里是局部变量);作为静态变量,存储在静态存储区,不会因为函数或复合语句的结束而自动释放内存空间,下一次进入这个区域时会继续使用上次的值。即直到程序结束才释放内存。
下面例子是当m为全局变量时(当在一个函数内定义了与全局变量同名的局部变量时,这里的局部变量会替换全局变量,走出这个区域后,同名的局部变量内存空间被释放,值又回到全局变量的值,详见下m)
int m=1;//定义全局变量m
func(int a,int b){
static int m,i=2;//在func函数里定义静态局部变量m,i
printf("%d\n",i);//i第二次的值是第一次运算后的3而非2
i+=m+1;m=i+a+b;
printf("%d,%d\n",i,m);
return(m);
}
int main()
{
printf("%d\n",m);//在没有再次定义m的main函数中m值为一开始定义1
int k=4,p;
p=func(k,m);
printf("%d\n",p);
p=func(k,m);
printf("%d",p);
return 0;
}
下面例子m是动态变量,不会储存值
func(int a,int b){
static int i=2;//在func函数里定义静态局部变量i
int m=0;//m定义为动态变量时不会自动赋初值0
printf("%d\n",i);//i第二次的值是第一次运算后的3而非2
i+=m+1;m=i+a+b;
printf("%d,%d\n",i,m);
return(m);
}
int main()
{
int m=1;//与func里的m不同
int k=4,p;
p=func(k,m);
printf("%d\n",p);
p=func(k,m);
printf("%d",p);
return 0;
}
文章小白,有错误或建议欢迎指教