动态存储方式和静态存储方式

2023-05-16

从变量的作用域的角度来观察,变量可以分为全局变量局部变量

  • 全局变量都是存放在静态存储区中的。因此它们的生存期是固定的,存在于程序的整个运行过程
  • 局部变量,如果不专门声明存储类别,都是动态地分配存储空间的

从变量值存在的时间(即生存期)观察,变量的存储有两种不同的方式:静态存储方式动态存储方式

  • 静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式
  • 动态存储方式是在程序运行期间根据需要进行动态的分配存储空间的方式
             用户区

程序区
静态存储区
动态存储区
数据存放在静态存储区和动态存储区;

静态存储区:

全局变量全部存储在静态存储区;

程序开始执行时给全局变量分配存储区,程序执行完毕就释放。在程序执行过程中占据固定的存储单元

动态存储区:

①函数形式参数

②函数中定义的没有用关键字static声明的变量

③函数调用时的现场保护和返回地址等存放在动态存储区

 函数调用开始时分配,函数结束时释放。在程序执行过程中,这种分配和释放是动态的


对于局部变量来说,声明存储类型的作用是指定变量存储的区域以及由此产生的生存期的问题,而对于全局变量来说,声明存储类型的作用是变量作用域的扩展问题

每一个变量和函数都有两个属性: 数据类型和数据的 存储类别
存储类别指的是数据在内存中存储的方式(如静态存储和动态存储)
存储类别包括: 自动的、静态的、寄存器的、外部的
根据变量的存储类别,可以知道变量的作用域和生存期
1.自动变量(auto变量)
  • 局部变量,如果不专门声明存储类别,都是动态地分配存储空间的
  • 调用函数时,系统会给局部变量分配存储空间,调用结束时就自动释放空间。因此这类局部变量称为自动变量
  • 自动变量用关键字auto作存储类别的声明
2.静态局部变量(static局部变量)
  • 希望函数中的局部变量在函数调用结束后不消失而继续保留原值,即其占用的存储单元不释放,在下一次再调用该函数时,该变量已有值(就是上一次函数调用结束时的值),这时就应该指定该局部变量为“静态局部变量”,用关键字static进行声明
    用static 声明一个变量的作用是:
      (1) 对局部变量用static声明,把它分配在静态存储区,该变量在整个程序执行期间不释放,其所分配的空间始终存在。
      (2) 对全局变量用static声明,则该变量的作用域只限于本文件模块(即被声明的文件中)。
3. 寄存器变量(register变量)
  • 一般情况下,变量(包括静态存储方式和动态存储方式)的值是存放在内存中的
  • 寄存器变量允许将局部变量的值放在CPU中的寄存器中
  • 现在的计算机能够识别使用频繁的变量,从而自动地将这些变量放在寄存器中,而不需要程序设计者指定
4.外部变量
  • 一般来说,外部变量是在函数的外部定义的全局变量,它的作用域是从变量的定义处开始,到本程序文件的末尾。在此作用域内,全局变量可以为程序中各个函数所引用。

      在一个文件内扩展外部变量的作用域
  • 外部变量有效的作用范围只限于定义处到本文件结束。
  • 如果用关键字extern对某变量作“外部变量声明”,则可以从“声明”处起,合法地使用该外部变量

 关于作用域和生存期的概念
  • 对一个变量的属性可以从两个方面分析:
    作用域:如果一个变量在某个文件或函数范围内是有效的,就称该范围为该变量的作用域
    生存期:如果一个变量值在某一时刻是存在的,则认为这一时刻属于该变量的生存期
  • 作用域是从空间的角度,生存期是从时间的角度
  • 二者有联系但不是同一回事


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态存储方式和静态存储方式 的相关文章

  • macOS原生支持NTFS读写的方法

    详细流程 xff1a 插上硬盘后 xff0c 查看你的硬盘名称 xff0c 这里假设名称是AngleDisk 打开Applications的Terminal在终端输入sudo nano etc fstab 敲击回车 现在你看到了一个编辑界面
  • Mac M1 安装brew 国内源

    1 command 43 space 打开搜索 2 输入terminal找到终端点击打开 3 拷贝以下代码放置到终端并回车 bin zsh c 34 curl fsSL https gitee com huwei1024 HomebrewC
  • 日语的-自-他动词区分

  • Sophus库安装和使用

    1 前言 Sophus库是一个较好的李群和李代数的C 43 43 库 xff0c 它很好的支持了SO 3 so 3 SE 3 和se 3 Sophus库是基于Eigen基础上开发的 xff0c 继承了Eigen库中的定义的各个类 因此在使用
  • 打开cmd后默认进入conda的base环境的解决办法

    解决方案 xff1a 命令行执行 xff1a xff08 取消默认加载环境 xff09 conda config set auto activate base false 次级解决方案 xff1a 修改 vim xff5e bashrc x
  • 数据库范式的一些理解

    一 假设一个表R 61 X xff0c Y xff0c Z xff0c 其中X Y Z是三个属性组 xff0c X是码 再假设R不符合3NF xff0c 即 xff1a X gt Y xff0c Y gt Z xff0c 其中Y不是码 xf
  • matlab修改默认当前文件夹

    操作步骤 找到 matlabrc m 文件 cd 39 Matalb的安装路径 39 cd toolbox local 编辑 matlabrc m 文件 在文件末尾添加打开时要转到的目录 xff0c 比如 xff1a cd 39 C Use
  • nvm下载各node版本时使用淘宝的镜像

    在nvm安装目录下的settings txt里 xff0c 添加如下两行代码 xff1a node mirror https npm taobao org mirrors node npm mirror https npm taobao o
  • conda清除无用安装包

    conda clean p 删除缓存 conda clean y all 删除pkgs目录下所有的无用安装包及cache
  • Node.js 获取GET、POST提交的数据

    表单提交过来的数据有两种方法 xff0c 一种是GET方式提交 xff0c 这种提交方法会把表单需要传输的数据写在url上 xff0c 一起带过去 xff0c 另一种是POST方式提交 xff0c POST方式提交会把表单数据携带在requ
  • 如何理解 JS 中的异步

    了解异步前 xff0c 先得知道什么是单线程 单线程 只有一个线程 xff0c 只能做一件事 代码示例 console log 1 alert 39 hello 39 console log 2 点击确认后 xff0c 才会打印出 2 JS
  • nodejs的特点(讲解的很清晰)

    1 异步I O 在Node中 xff0c 绝大多数的操作都以异步的方式进行调用 Ryan Dahl排除万难 xff0c 在底层构建了很多异步I O的API xff0c 从文件读取到网络请求等 xff0c 均是如此 这样的意义在于 xff0c
  • 如何优雅地在word中插入代码

    打开这个网址 xff1a https highlightcode com
  • conda install和pip install有什么区别?

    pip pip install xxx 在特定环境里使用pip xff0c 下载的包会存在特定环境的目录里面 xff0c 例如 D Anaconda3 envs nlp Lib site packages fasttext 使用pip un
  • Ubuntu下安装Clion

    前言 CLion 是一款由 JetBrains 开发的 C 43 43 集成开发环境 xff08 IDE xff09 xff0c 它拥有许多强大的功能 xff0c 如代码自动完成 调试器 版本控制等等 CLion本身是收费软件 xff0c
  • 如何查看docker容器里的操作系统

    在linux中 xff0c 我们可以用uname命令来查看当前的操作系统 在docker容器里 xff0c 我们要查看容器操作系统时 正确的方法是 xff1a cat etc issue 错误姿势 xff1a cat process ver
  • win10关于hyper-v除了在主板设置cpu虚拟化VX-T/AMD-V,还需要在CMD执行以下命令

    I managed to resolve the issue but not by uninstalling Hyper V I saw a couple of suggestions but I find this one situabl
  • 人话解读GPLv3

    GPL最新版本为v3 xff0c 在开源软件许可证的采用量上 xff0c 位列前三名或者前四名 其他三位是MIT Apache GPLv2 如果你浸淫软件业已久 xff0c 作为开源界如雷贯耳的许可证 xff0c 无论如何也要了解一下 xf
  • R语言<-和=赋值的区别-实验

    R系统版本 version platform x86 64 pc linux gnu arch x86 64 os linux gnu system x86 64 linux gnu status major
  • rust-crate

    让我们来看看创建包的时候会发生什么 首先 xff0c 我们输入命令 cargo new xff1a cargo new my project Created binary application my project ls my proje

随机推荐