C语言的静态存储方式和动态存储方式

  • 从变量的作用域角度可以对变量进行分类为【全局变量】和【局部变量】
  • 从变量值的生存期可以对变量进行分类为【静态存储方式】和【动态存储方式】
  • 用户的存储空间可大致分为以下三种
    1、程序区
    2、静态区
    3、动态区

一、 静态存储

1、基本概念

  • 静态存储方式:指在程序运行时,给变量分配固定的存储空间的方式

2、 静态存储区存放以下变量:

  • 全局变量:在程序开始执行时给全局变量分配存储区,程序运行完毕之后释放。在程序运行过程中它们占据固定的存储单元而不动态进行分配和释放。
  • 静态局部变量:有时希望局部变量的值在函数调用结束后不消失而保留原值,这时就应该指定局部变量为“静态局部变量”了,用关键字static进行生命

二、动态存储

1、基本概念

动态存储方式:指在程序运行时,根据需要给变量分配动态的存储空间的方式

2、动态存储区存放以下变量。

  • 函数形式的参数
  • 自动变量(未加static声明的局部变量):函数中的局部变量,如不声明为static存储类别的变量,则都是动态存储类别的。函数的形参和函数体中定义的变量都属于此类。在调用函数的时候系统给他自动分配空间,在函数调用结束后,自动释放存储空间。这类局部变量称为自动变量,用关键字auto声明存储类别。
  • 函数调用时的现场保护和返回地址。

三、示例脚本代码

1、示例脚本代码
static int c;
int prine(register int number)//判断是否为素数函数
{
	register int flag =1;
	auto int n;
	for(n=2;n<number/2  && flag==1;n++)
		if (number%n==0)
			flag=0;
		return flag;
}
demo (int a )//static、auto变量的演示函数
{
	auto int b=0;
	int d;
	static c=3;
	b=b+1;
	c=c+1;
	lr_output_message("demo()函数中的d=%d",d);
	lr_output_message("demo()函数中的static c=%d",c);
	return a+b+c;
}

Action()
{
	int a=2,i;
	for(i=0;i<3;i++)
	{
		lr_output_message("demo()函数部分第%d运行情况如下:",i+1);
		lr_output_message("函数demo运行结果为:%d",demo(a));
		lr_output_message("------------------\n\r");
	}
	
	//判断13是否为素数,并输出提示信息
	if(prime(13)==0) lr_output_message("13不是素数!");
	else lr_output_message("13是素数!");
	
	lr_output_message("c=%d",c);//输出静态变量的值
	
	return 0;
}
2、以上代码的输出信息
Running Vuser...
Starting iteration 1.
Starting action Action.
Action.c(30):demo()函数部分第1运行情况如下:
Action.c(18):demo()函数中的d=25362920;
Action.c(19):demo()函数中的static c=4;
Action.c(31):函数demo运行结果为:7
Action.c(32):---------------------

Action.c(30):demo()函数部分第2运行情况如下:
Action.c(18):demo()函数中的d=25362920;
Action.c(19):demo()函数中的static c=5;
Action.c(31):函数demo运行结果为:8
Action.c(32):---------------------

Action.c(30):demo()函数部分第3运行情况如下:
Action.c(18):demo()函数中的d=25362920;
Action.c(19):demo()函数中的static c=6;
Action.c(31):函数demo运行结果为:9
Action.c(32):---------------------

Action.c(36):13是素数!
Action.c(38):c=0
Ending action Action.
Ending iteration 1.
Ending Vuser...
3、解析
  • 在demo()函数中,d未被赋值,则输出的是值应该是随机数
  • 如果没给自动变量赋初值,则在它的值为一个不确定值,自动变量在函数调用的时候,每调用一次,给函数重新赋一次值。
  • 静态局部变量在定义时不赋值,则编译时默认为0。如上静态变量c。
  • 静态局部变量在编译的时候赋初值,即只赋初值一次。参见demo()函数中的static c=3,每次调用时,它的值都在变化,第一次调用c=3;c=c+1后c的值为4,第二次调用c的值为4…
  • 14
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值