我们都知道在C语言中不同类型的变量在内存中的存放位置不同的,从内存角度上讲,不同内存块中存放的代码或者变量其属性(主要是作用域、生命周期、链接属性)是不同的。

首先我们介绍一下作用域、生命周期已经链接属性的概念

1:作用域

作用域也就是指变量其作用的范围

(1)局部变量为代码块作用域(也就是说局部变量的作用范围是{  })

(2)函数和全局变量是文件作用域,进一步讲其作用范围就是函数和全局变量定义或者声明后的部分。

2:生命周期

生命周期也就是变量的产生时间和消亡时间

(1)栈变量的生命周期:局部变量是被分配到栈上面的(栈变量),其生命周期是临时的,临时的意思是按需要去创建、使用、消亡。比如在一个子函数里面定义了一个局部变量int a;那么当这个子函数被调用执行的时候,局部变量int a;会被创建在栈上面(符号a和栈上面的某个内存相绑定),当这个子函数被调用结束时,局部变量int a就消亡了(取消符号a和栈上面的某个内存的绑定),很现实的一个例子就是,当我们写个程序去读取局部变量的地址时,每次读取的地址值是不一样的。

(2)堆变量的生命周期

首先需要明白一点,堆内存空间是客观存在的,它是由系统维护的一段内存空间,程序员只是向系统申请堆内存,然后释放,所以堆变量也是有生命周期的,其生命周期就是mallloc(返回申请堆内存的首地址)申请到free释放,

(3)数据段、bss段的生命周期

全局变量的生命周期是永久的,永久的意思是从被定义开始,一直到程序结束。

(4)代码段、只读段的生命周期

代码段存放的是程序执行的代码(也就是函数),它的生命周期是永久的,但是一般不去研究代码的生命周期,需要注意的是放在代码段的还有const修饰的常量和字符常量(const类型的常量、字符串常量有时候放在rodata段,有时候放在代码段,取决于平台)

3:链接属性

链接属性是指代码在链接时的属性,包括外连接、内链接、无链接三种

(1)外连接:意思是外部链接属性,也就是说可以在整个程序范围(可以跨文件)内进行链接

(2)内链接:意思是内部链接属性,也就是说可以在当前c文件范围内进行链接

(3)无链接:意思是这个符号本身不参与链接,所有的局部变量(auto的,static的)都是无链接的

注意这里还涉及一个同名变量屏蔽规则的问题

(1)问题:编程时,不可避免会出现同名变量。变量同名后不一定会出错。

(2)首先,如果两个同名变量作用域不同且没有交叠,这种情况下同名没有任何影响。比如两个子函数里面都定义了局部变量int a;

(3)其次,如果两个同名变量作用域有交叠,C语言规定在作用域交叠范围内,

作用域小的一个变量会掩蔽掉作用域大的那个(就小范围原则)。比如定义了一个全局变量int a;又在子函数定义了局部变量int a;那么在这个子函数里面起作用的就是局部变量int a;

接下来从变量的类型角度出发,分析代码这三打要素具体到不同变量中的意义

1:普通局部变量

作用域为代码块作用域,生命周期为临时性生命周期,链接属性为无链接

普通局部变量被分配到栈上面,是按需创建、使用、消亡的,栈每次分配给变量是的地址是不确定的(随机分配)这就决定了其链接属性是无链接。

2:静态局部变量(static修饰的局部变量)

静态局部变量被分配到了数据段或者bss段(显示初始化为非0则被分配到数据段,未显式初始化或者显式初始化为0则被分配到bss段),作用域为代码块作用域,生命周期为永久性生命周期,链接属性为无链接(因为它的作用域是代码块作用域)。因为静态局部变量被分配到了数据段或者bss段,所以它的生命周期是永久的,所分配的地址和静态局部变量的符号的绑定是不变的,直到程序结束,所以在一个程序中多次使用同一个静态局部变量时其实操作的是同一段内存,因为有这一特性,所以静态局部变量常用来统计子函数被调用的次数。

3:全局变量和普通函数

作用域为文件作用域,生命周期为永久,链接属性为外连接

需要注意的是全局变量和函数不要在头文件中定义,原因是一个程序多处调用这个头文件(头文件中的内容在被预处理的时候是在文件中原地展开的)时就会出现重复定义(当然使用inline修饰的函数是可以放在有文件中的,并且不会城乡重复定义)。全局变量的外连接属性就决定了其必须是文件作用域以及永久的生命周期。

本文转自 菜鸟养成记 51CTO博客,原文链接:http://blog.51cto.com/11674570/1870075

C语言之从内存角度理解不同类型的变量相关推荐

  1. java从内存角度理解类变量_深入理解volatile类型——从Java虚拟机内存模型角度...

    一.前言 在java多线程编程中,volatile可以用来定义轻量级的共享变量,它比synchronized的使用成本更低,因为它不会引起线程上下文的切换和调度.所谓知己知彼.百战不殆.本文从JVM内 ...

  2. 指针在c语言中的运用,怎么理解C语言中的指针,如何运用?

    恰好我之前写了一系列介绍 C 语言的文章,介绍了什么是指针,以及为什么要使用指针,下面摘录一部分,感兴趣的话,可以点我了解更多. 什么是 C语言指针? 不同的数据类型的主要区别在于占用的存储空间不同. ...

  3. 聊聊高并发(三十三)Java内存模型那些事(一)从一致性(Consistency)的角度理解Java内存模型

    可以说并发系统要解决的最核心问题之一就是一致性的问题,关于一致性的研究已经有几十年了,有大量的理论,算法支持.这篇说说一致性这个主题一些经常提到的概念,理清Java内存模型在其中的位置. 一致性问题更 ...

  4. 【C 语言】数组 ( 多维数组本质 | 步长角度 理解 多维数组本质 )

    文章目录 一.从 步长角度 理解 多维数组本质 二.代码示例 一.从 步长角度 理解 多维数组本质 声明一个二维数组 ; // 声明一个多维数组int array[2][3]; 二级指针 : arra ...

  5. 视频教程-C语言-从汇编角度理解C语言的本质-C/C++

    C语言-从汇编角度理解C语言的本质 擅长JavaWeb开发,游戏逆向外挂与反外挂,游戏保护对抗 孙冉 ¥49.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订阅 ...

  6. java继承原理内存角度_Java基础知识巩固

    最近发现自己的Java基础知识还是有点薄弱,刚好有点空闲时间进行再补一补,然后进行整理一下,方便自己以后复习.其实个人认为Java基础还是很重要的,不管从事Java后端开发还是Android开发,Ja ...

  7. 从 .NET 开发人员的角度理解 Excel 对象模型--------结合上一篇 vb code excel 单元格锁定...

    从 .NET 开发人员的角度理解 Excel 对象模型 发布日期: 10/27/2004 | 更新日期: 10/27/2004 Ken Getz MCW Technologies, LLC 适用于: ...

  8. 从 .NET 开发人员的角度理解 Excel 对象模型 (From MSDN)

    从 .NET 开发人员的角度理解 Excel 对象模型 发布日期 : 10/27/2004| 更新日期 : 10/27/2004 Ken Getz MCW Technologies, LLC 适用于: ...

  9. python终结一个循环额_Python语言入门之内存管理方式和垃圾回收算法解析

    本文主要向大家介绍了Python语言入门之内存管理方式和垃圾回收算法解析,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 在列表,元组,实例,类,字典和函数中存在循环引用问题.有 ...

最新文章

  1. tinyxml 读取文本节点_【C++】【TinyXml】xml文件的读写功能使用——写xml文件
  2. 下一个10年,解决问题靠“大脑”
  3. 关于10g RAC监听设置,tnsnames.ora设置,VIP及客户端配置问题
  4. 对XMLHttpRequest异步请求的面向对象封装
  5. 在非k8s 环境下 的应用 使用 Dapr Sidekick for .NET
  6. java中怎么把生成文件到项目根目录_[SpringBoot2.X] 02- 项目结构介绍
  7. mysql dp.cal 显示汉子_计算1到N中各个数字出现的次数 --数位DP
  8. linux磁盘满了怎么处理
  9. Flash中图片的逐步加载
  10. [算法]直线与圆的交点程序设计
  11. 苹果电脑安装鸿蒙系统,苹果笔记本可以安装别的操作系统吗?
  12. unity简易游戏制作
  13. python免费教程发布页
  14. atmega128 单片机 密码锁 PROTEUS 仿真
  15. Grounded theory相关知识
  16. android能用svg格式,关于Android SVG图形:Android SVG图形 – 将当前PNG文件转换为svg格式的缺点...
  17. 《自然语言处理实战入门》 深度学习组件TensorFlow2.0 ---- 文本数据建模流程
  18. 已知字符串STRING以‘$’为结束标志;统计其中小写字母的个数,结果送到COUNT单元,并把该字符串中的小写字母变成大写字母,其它字符保持不变。要求分别在屏幕上输出原字符串以及修改后的字符串。
  19. 利用vue实现“显示更多”功能
  20. Apple ID 登录

热门文章

  1. VC6开发视频监控ActiveX控件总结
  2. HDU2571:命运(简单dp)
  3. 【python】获取51cto博客的文章列表
  4. 查看tomcat启动文件都干点啥---server对象
  5. Android SQLite 数据库详细介绍
  6. 搜索引擎反作弊之内容作弊
  7. 桌面电话的进化到统一通信
  8. [博客园公告]编辑器改进(二)
  9. Spring Boot 专栏全栈开发实战
  10. visio2013跨线问题