静态局部变量的陷阱

 原代码如下 

 

#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;
 }

 文章小白,有错误或建议欢迎指教

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值