静态存储和动态存储详解

静态存储与动态存储:

     静态存储变量通常是在变量定义时就分定存储单元并一直保持不变, 直至整个程序结束。动态存储变量是在程序执行过程中,使用它时才分配存储单元, 使用完毕立即释放。 典型的例子是函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配, 调用函数完毕立即释放。如果一个函数被多次调用,则反复地分配、 释放形参变量的存储单元。从以上分析可知, 静态存储变量是一直存在的, 而动态存储变量则时而存在时而消失。我们又把这种由于变量存储方式不同而产生的特性称变量的生存期。 生存期表示了变量存在的时间。 生存期和作用域是从时间和空间这两个不同的角度来描述变量的特性,这两者既有联系,又有区别。 一个变量究竟属于哪一种存储方式, 并不能仅从其作用域来判断,还应有明确的存储类型说明。

 

变量的动态存储与静态存储简介

    在C语言中,对变量的存储类型说明有以下四种:自动变量(auto)、寄存器变量(register)、外部变量(extern)、静态变量(static)。自动变量和寄存器变量属于动态存储方式,外部变量和静态内部变量属于静态存储方式。 
1  内部变量的存储方式 
1.1.静态存储──静态内部变量 
(1)定义格式: static  数据类型  内部变量表; 
(2)存储特点 
1)静态内部变量属于静态存储。在程序执行过程中,即使所在函数调用结束也不释放。换句话说,在程序执行期间,静态内部变量始终存在,但其它函数是不能引用它们的。 
2)定义但不初始化,则自动赋以"0"(整型和实型)或'\0'(字符型);且每次调用它们所在的函数时,不再重新赋初值,只是保留上次调用结束时的值! 
(3)何时使用静态内部变量 
1)需要保留函数上一次调用结束时的值。 
2)变量只被引用而不改变其值。 
2.动态存储──自动局部变量(又称自动变量) 
(1)定义格式:[auto]  数据类型  变量表; 
(2)存储特点 
1)自动变量属于动态存储方式。在函数中定义的自动变量,只在该函数内有效;函数被调用时分配存储空间,调用结束就释放。 
在复合语句中定义的自动变量,只在该复合语句中有效;退出复合语句后,也不能再使用,否则将引起错误。 
2)定义而不初始化,则其值是不确定的。如果初始化,则赋初值操作是在调用时进行的,且每次调用都要重新赋一次初值。 
3)由于自动变量的作用域和生存期,都局限于定义它的个体内(函数或复合语句),因此不同的个体中允许使用同名的变量而不会混淆。即使在函数内定义的自动变量,也可与该函数内部的复合语句中定义的自动变量同名。 
建议:系统不会混淆,并不意味着人也不会混淆,所以尽量少用同名自动变量! 
[案例7.13]自动变量与静态局部变量的存储特性。 
/*案例代码文件名:AL7_13.C*/ 
void  auto_static(void) 
   {  int var_auto=0; /*自动变量:每次调用都重新初始化*/ 
       static int var_static=0; /*静态局部变量:只初始化1次*/ 
       printf(“var_auto=%d, var_static=%d\n”, var_auto, var_static); 
       ++var_auto; 
       ++var_static; 
     } 
main() 
     {  int i; 
       for(i=0; i<5; i++) auto_static(); 
     } 
3.寄存器存储──寄存器变量 
一般情况下,变量的值都是存储在内存中的。为提高执行效率,C语言允许将局部变量的值存放到寄存器中,这种变量就称为寄存器变量。定义格式如下: 
          register   数据类型   变量表; 
(1)只有局部变量才能定义成寄存器变量,即全局变量不行。 
(2)对寄存器变量的实际处理,随系统而异。例如,微机上的MSC和TC 将寄存器变量实际当作自动变量处理。 
(3)允许使用的寄存器数目是有限的,不能定义任意多个寄存器变量。 
7.6.2  外部变量的存储方式 
外部变量属于静态存储方式: 
(1)静态外部变量──只允许被本源文件中的函数引用 
其定义格式为:  static  数据类型  外部变量表; 
(2)非静态外部变量──允许被其它源文件中的函数引用 
定义时缺省static关键字的外部变量,即为非静态外部变量。其它源文件中的函数,引用非静态外部变量时,需要在引用函数所在的源文件中进行说明: 
extern  数据类型  外部变量表; 
注意:在函数内的extern变量说明,表示引用本源文件中的外部变量!而函数外(通常在文件开头)的extern变量说明,表示引用其它文件中的外部变量。 
静态局部变量和静态外部变量同属静态存储方式,但两者区别较大: 
(1)定义的位置不同。静态局部变量在函数内定义,静态外部变量在函数外定义。 
(2)作用域不同。静态局部变量属于内部变量,其作用域仅限于定义它的函数内;虽然生存期为整个源程序,但其它函数是不能使用它的。 
静态外部变量在函数外定义,其作用域为定义它的源文件内;生存期为整个源程序,但其它源文件中的函数也是不能使用它的。 
    (3)初始化处理不同。静态局部变量,仅在第1次调用它所在的函数时被初始化,当再次调用定义它的函数时,不再初始化,而是保留上1次调用结束时的值。而静态外部变量是在函数外定义的,不存在静态内部变量的“重复”初始化问题,其当前值由最近1次给它赋值的操作决定。 
务必牢记:把局部变量改变为静态内部变量后,改变了它的存储方式,即改变了它的生存期。把外部变量改变为静态外部变量后,改变了它的作用域,限制了它的使用范围。因此,关键字“static”在不同的地方所起的作用是不同的。 
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值