开发者社区> 技术让梦想更伟大-李肖遥> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

变量的存储方式和生存期

简介: 从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量。    另一个角度,从变量值存在的作时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式。    静态存储方式:是指在程序运行期间分配固定的存储空间的方式。
+关注继续查看
从变量的作用域(即从空间)角度来分,可以分为全局变量局部变量。 
   另一个角度,从变量值存在的作时间(即生存期)角度来分,可以分为静态存储方式动态存储方式。 
   静态存储方式:是指在程序运行期间分配固定的存储空间的方式。 
   动态存储方式:是在程序运行期间根据需要进行动态的分配存储空间的方式。 
       用户存储空间可以分为三个部分: 
       1)  程序区; 
       2)  静态存储区; 
       3)  动态存储区;

   全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不动态地进行分配和释放;动态存储区存放以下数据: 
1)  函数形式参数; 
2)  自动变量(未加 static 声明的局部变量); 
3)  函数调用实的现场保护和返回地址; 
    对以上这些数据,在函数开始调用时分配动态存储空间,函数结束时释放这些空间。在 c 语言中,每个变量和函数有两个属性:数据类型数据的存储类别
    一 局部变量的类别:
    1 auto变量 
    函数中的局部变量,如不专门声明为 static 存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量),都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。这类局部变量称为自动变量。自动变量用关键字 auto 作存储类别的声明。
 
    2 用 static声明局部变量 
    有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,这时就应该指定局部变量为“静态局部变量”,用关键字 static 进行声明。  
    对静态局部变量的说明: 
    1)  静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储空间,函数调用结束后即释放。 
    2)  静态局部变量在编译时赋初值,即只赋初值一次;而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。 
    3)  如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值 0 (对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。
    无论加什么,他都是局部变量。
    例子:int fac(int n)
              {
                 static int f=1;//f静态局部变量只赋值依次,也就是每次调用时并不会再赋值f=1
                 f=f*n;
                 return(f);
              }
 
    3 register变量 
    为了提高效率,C 语言允许将局部变量得值放在 CPU 中的寄存器中,这种变量叫“寄存器变量”,用关键字 register 作声明。
    说明: 
    1)  只有局部自动变量和形式参数可以作为寄存器变量; 
    2)  一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量; 
    3)  局部静态变量不能定义为寄存器变量。
 
    注意:局部变量默认为auto的存储类别。即动态存储类别。
 
    二 全局变量 
    对全局变量来说,都是存在于静态存储区,但是存在一个作用域的问题。
 
    1 在一个文件内扩展外部变量的作用域
    外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字 extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。
     如:extern int a;
         下面有 int a;
 
    2 将外部变量的作用域扩展到其他文件中
     如 file1.c 中 int A;如果file2.c 中extern A就扩展到文件2中了。
 
    3 将外部变量的作用域限制在本文件中
    在程序设计设计中希望一些外部变量只限于被本文件引用,而不能被其他文件引用。这时可以再定义外部变量时加一个static声明。
    如在文件开头写上 static int a;
    这种加上static声明、只能用于本文件的外部变量称为:静态外部变量
 
    这种写法的意义:
    由于程序设计常由若干个人完成各个模块,个人独立的在其设计的文件中使用相同的外部文件名而互不相干,只需在每个文件中定义外部变量时加上static即可。这样就为程序的模块化,通用性提供了方便。
 
    注意:不要误认为外部变量加static声明后才采取静态存储方式,外部变量都是静态存储方式的。
    static的作用
    a.对局部变量声明,把他分配在静态存储区。
    b.对全局变量声明,把该变量的作用域限于本文件中。
 
    注意:全局变量默认为:int a的形式。作用域为:  从变量定义处开始,到本程序文件的末尾。

内存区域的划分:

  1. 栈区:由编译器自动分配和释放的内存区域,用于存放函数的参数值,局部变量的值等。随着函数的调用和返回,栈区的数据将动态变化。
  2. 堆区:程序员向系统申请或释放。若程序员在程序结束时还没有释放,则可能由操作系统回收。malloc.
  3. 全局区:用来保存全局变量和静态变量。在进入程序时分配区域,程序结束后由系统释放。
  4. 文字常量区:用于保存常量字符串的内存区域,程序结束后,由系统释放。
  5. 程序代码区:用于保存函数体的二进制代码。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
成员变量和局部变量在内存中的变化
今天我们从成员变量和局部变量来加深印象,彻底弄懂成员变量和局部变量在内存中的变化
0 0
【C 语言】变量本质 ( 变量概念 | 变量本质 - 内存空间别名 | 变量存储位置 - 代码区 | 变量三要素 )
【C 语言】变量本质 ( 变量概念 | 变量本质 - 内存空间别名 | 变量存储位置 - 代码区 | 变量三要素 )
0 0
指针,c语言关键字,作用域,生命周期,内存数据存储
 作用域:变量可被访问的有效范围。 生命周期:变量存储空间的有效生存时间。 extern int c;   通过关键字extern来告诉程序int c;是别的程序中定义的。 extern int fun(void); 表示这个方式是在其它的文件中定义的。 全局变量在程序的任何地方都可以被调用到,生命周期是从程序启动到程序
1026 0
变量的内存存放与作用域
1.变量的声明、定义、初始化 一个程序可由多个源文件实现。 变量可以多次声明,但只能被定义一次。 声明通过extern关键字实现。 extern int i;  //声明 int j;   //定义 2.变量的内存存放 全局变量与局部变量在没有初始化时,取初值的方式不同。前者是全0. c++内存分为代码、堆、栈、常量和全局//静态存储区。 不同变量的存储位置: 全局/
804 0
对比常量存储与堆栈
翻译人员: 铁锚 翻译时间: 2013年12月3日 原文链接: Static Storage vs Heap vs Stack 下面是对编译器内存分配的总结: 1. 静态分配 vs 动态分配 静态分配: 编译器只依赖于程序代码中的字面量就可以进行分配的部分。
451 0
局部变量,静态局部变量,全局变量,静态全局变量在内存中的存放区别(转)
我们先来看内存中的几大区:  内存到底分几个区? 下面有几种网上的理解,我整理一下: 一:  1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
577 0
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载