当前位置: 首页 > news >正文

【时时三省】(C语言基础)变量的存储方式和生存期

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省

动态存储方式与静态存储方式

从变量的作用域(即从空间)的角度来观察,变量可以分为全局变量和局部变量。

还可以从另一个角度,即从变量值存在的时间(即生存期)来观察。

有的变量在程序运行的整个过程都是存在的,而有的变量则是在调用其所在的函数时才临时分配存储单元,而在函数调用结束后该存储单元就马上释放了,变量不存在了。也就是说,变量的存储有两种不同的方式:

静态存储方式和动态存储方式。静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式,而动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式。

先看一下内存中的供用户使用的存储空间的情况。这个存储空间可以分为3部分:

( 1 )程序区;

( 2 )静态存储区;

( 3 )动态存储区。

数据分别存放在静态存储区和动态存储区中。全局变量全部存放在静态存储区中,在程序开始执行时给全局变量分配存储区,程序执行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不是动态地进行分配和释放。

在动态存储区中存放以下数据:

①函数形式参数。在调用函数时给形参分配存储空间。

②函数中定义的没有用关键字static声明的变量,即自动变量。

③函数调用时的现场保护和返回地址等。

对以上这些数据,在函数调用开始时分配动态存储空间,函数结束时释放这些空间。在程序执行过程中,这种分配和释放是动态的,如果在一个程序中两次调用同一函数,而在此函数中定义了局部变量,在两次调用时分配给这些局部变量的存储空间的地址可能是不相同的。

如果一个程序中包含若干个函数,每个函数中的局部变量的生不存期并不等于整个程序比时的执行周期,它只是程序执行周期的一部分。在程序执行过程中,先后调用各个函数,此时会动态地分配和释放存储空间。

在C语言中,每一个变量和函数都有两个属性:数据类型和数据的存储类别。对数据类型,已经熟知(如整型、浮点型等)。存储类别指的是数据在内存中存储的方式(如静态存储和动态存储)。

在定义和声明变量和函数时,一般应同时指定其数据类型和存储类别,也可以采用默认方式指定(即如果用户不指定,系统会隐含地指定为某一种存储类别)。

C的存储类别包括4种:自动的( auto )、静态的( static )、寄存器的( register )、外部的( extern )。根据变量的存储类别,可以知道变量的作用域和生存期。

局部变量的存储类别

1.自动变量(auto变量)

函数中的局部变量,如果不专门声明为static(静态)存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。函数中的形参和在函数中定义的局部变量(包括在复合语句中定义的局部变量),都属于此类。在调用该函数时,系统会给这些变量分配存储空间,在函数调用结束时就自动释放这些存储空间。因此这类局部变量称为自动变量。自动变量用关键字auto作存储类别的声明。

例如:

int f ( int a ) / /定义f函数,a为形参

{

auto int b,c = 3;/ /定义b,c为自动变量

...

}

其中,a是形参,b和c是自动变量,对c赋初值3。执行完f函数后,自动释放a,b,c所占的存储单元。

实际上,关键字auto可以省略,不写auto则隐含指定为“自动存储类别”,它属于动态存储方式。程序中大多数变量属于自动变量。前面几章中介绍的例子,在函数中定义的变量都没有声明为auto,其实都隐含指定为自动变量。

 

相关文章:

  • 医美宏脉软件如何通过快解析实现远程访问?
  • 【java】【服务器】线程上下文丢失 是指什么
  • 【51单片机】4. 模块化编程与LCD1602Debug
  • 2025最全TS手写题之partial/Omit/Pick/Exclude/Readonly/Required
  • STM32使用水位传感器
  • 牛客round95D
  • 科伦药业:以“三发引擎”驱动创新,全面迈入价值收获新周期
  • TCA 循环中间体如何改写肝损伤命运【AbMole】
  • VAS1086Q 奇力科技线性芯片车规用品LED驱动芯片
  • 无人机EN 18031欧盟网络安全认证详细解读
  • ABAP设计模式之---“童子军法则(The Boy Scout Rule)”
  • 最短路径算法总结
  • 卡尔曼滤波器:从概念到应用
  • ICDAR数据集简介
  • RAID存储技术概述
  • 破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
  • 2025年- H79-Lc187--118. 杨辉三角(找规律)--Java版
  • 初识Docker——容器化革命核心概念
  • LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
  • 【Proteus仿真】【32单片机-A010】步进电机控制系统设计
  • vi手册模板免费/深圳seo云哥
  • 店铺只做商品展示网站怎么做/网络营销推广技术
  • 如何做漂亮的网站/关键词优化工具
  • 上海网站建设百度推广公司/高端网站建设企业
  • 怎么做网页长图/宝鸡seo外包公司
  • 品牌网站设计公司哪家/长沙靠谱的关键词优化