各位看官们,大家好。上一回中咱们说的是C程序内存布局的样例,这一回咱们继续说该样例。闲话休提,言归正转。让我们一起talk C栗子吧。

看官们,关于C程序内存布局的样例,我们在前面的两个章回都介绍过了,这一回我们将对前面章回中的内容进行总结和提示。

内存布局总结

C程序的内存布局主要有四个分区:代码区,数据区(data和bss)。堆区和栈区。能够使用readelf -S filename查看各个分区的内存地址。这四个分区在内存中从低地址空间開始依次向高地址延伸。我们再次使用前面章回中的图直观地展示给大家,而且对这些分区做一个全面的总结。

  • 代码区:主要存放程序的代码。位于内存的低地址空间中。
  • 数据区:它的地址空间位于代码区上面。主要存放程序中的变量,只是函数中的局部非静态变量不在该区域中,而是在栈区中。关于变量的类型不同。存放的区域也不同,更加具体的划分。请參考以下data和bss相关的信息。
  • data:主要存放程序中初始化的全局变量和局部静态变量。

    当中全局变量不用区分静态和非静态。仅仅要是全局变量都在该区域中。

  • bss:主要存放程序中未初始化的全局变量和局部静态变量。

    当中全局变量不用区分静态和非静态,仅仅要是全局变量都在该区域中。

  • 堆区:位于数据区上面。堆区的大小不固定,它主要存放程序中动态分配的内存。该区域的分配和回收由程序猿自己控制。因此也easy出问题。
  • 栈区:位于堆区上面,栈区的大小也不固定。它主要存放函数中的局部非静态变量和函数调用相关的信息。该区域由系统进行管理,程序猿不能控制。

总结完分区的内容后。我们结合前面章回中的样例,总结一下样例中各个变量在内存中的分布信息,大家从中能够看到,样例中各个变量在内存中的分布和我们上面总结的内容全然一致。

内存分区                分区起始地址       分区中存放的变量和代码
栈区: 0xbfde3000 存放函数和局部变量:la1,la2,i
堆区: 0x0964d000 存放动态分配的内存空间:p所指向的空间.
数据区中的bss区: 0x0804a038 存放程序中未初始化的全局变量和局部静态变量:ga1,static_la1
数据区中data区: 0x0804a028 存放程序中初始化的全局变量和局部静态变量:ga2,static_la2
代码区: 0x080483e0 存放程序的代码

内存布局细节

除了总结外,我们另一些小的细节须要共享给大家。

希望引起大家的注意:

  • 1.在内存布局图中堆区和栈区的分界处各有一条绿线。它表示堆区和栈区的大小是在变化的,它们不像代码区和数据区一样拥有固定的大小。
  • 2.堆区的内存空间是从低地址向高地址延伸,而栈区的内存空间是从高地址向低地址延伸。虽然它们都是大小能够变化的分区。可是在分区变化的方向上正好相反。
  • 3.程序中代码区和数据区的地址空间是固定的。不会随着程序执行而发生变化。

    可是程序中堆区和栈区的地址空间是动态变化的。已经有细心的看官发现了,我们在上一回中的样例,执行过两次。位于数据区中的变量地址在两次执行结果中全然一致,可是位于堆区和栈区中的变量地址在两次执行结果中不同样。

    这便是最好的证明。

内存布局之外

看官们,俗话说的好,当局者迷。旁观者清。在大家细致观察内存中的各个分区时。让我们跳出这些分区之外,从整个内存的角度来做一些说明,希望能把大家就“迷局”中拉出来 。

  • 1.我们在这些章回中说的地址都是指虚拟内存地址,这点在一百二十九回介绍过。

  • 2.内存的布局除了我们介绍的这四个分区外,还有其他的分区。仅仅是这四个分区与代码的关系更加密切一些。
  • 3.使用readelf工具能够查看可执行文件里的分区信息,只是这里仅仅使用了该命令的S选项,其他的选项没有介绍,大家能够自己摸索一下。
  • 4.通过/proc虚拟文件夹中的文件来查看内存相关的信息。主要有cmdline,maps,status。

    readelf查看的是程序已经固定的静态信息,像堆,栈这些动态信息,就须要查看proc文件夹中的文件了,该文件夹中的文件提供了程序执行时的实时信息。

各位看官。关于C程序内存布局的样例咱们就讲到这里。欲知后面还有什么样例,且听下回分解 。


一起talk C栗子吧(第一百三十一回:C语言实例--C程序内存布局三)的更多相关文章

  1. 一起talk C栗子吧(第一百二十一回:C语言实例--线程知识体系图)

    各位看官们.大家好,上一回中咱们说的线程属性的样例.这一回咱们说的样例是:线程知识体系图.闲话休提.言归正转. 让我们一起talk C栗子吧! 我们在前面的章回中介绍了与线程相关的知识,在今天的章回中 ...

  2. PIC12F629帮我用C语言写个程序,控制三个LED亮灭

    http://power.baidu.com/question/240873584599025684.html?entry=browse_difficult PIC12F629帮我用C语言写个程序,控 ...

  3. 一起talk C栗子吧(第一百二十三回:C语言实例--显示变量和函数的地址)

    各位看官们,大家好,上一回中咱们说的是多线程的样例.这一回咱们说的样例是:显示变量和函数的地址. 闲话休提,言归正转.让我们一起talk C栗子吧! 在编敲代码时,有时候须要获取程序中变量和函数的地址 ...

  4. [你必须知道的.NET]第三十一回,深入.NET 4.0之,从“新”展望

    发布日期:2009.05.22 作者:Anytao © 2009 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. /// <summary> /// 本文开始,将以& ...

  5. C语言实例-能组成多少个三位数?

    题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. 源代码: #i ...

  6. 一起talk C栗子吧(第十二回:C语言实例--单链表一)

    各位看官们,大家好.从今天開始,我们讲大型章回体科技小说 :C栗子.也就是C语言实例.闲话休提, 言归正转. 让我们一起talk C栗子吧! 看官们,上一回中咱们没有说详细的样例,并且是说了样例中的文 ...

  7. 一起talk C栗子吧(第一百二十七回:C语言实例--查看main函数的參数)

    各位看官们,大家好,上一回中咱们说的是static关键字的样例,这一回咱们说的样例是:查看main函数的參数.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们.我们在第五十七回中介绍过mai ...

  8. 一起talk C栗子吧(第九十回:C语言实例--使用管道进行进程间通信三)

    各位看官们,大家好,上一回中咱们说的是使用管道进行进程间通信的样例.这一回咱们说的样例是:使用管道进行进程间通信.只是使用管道的方式不同样.闲话休提,言归正转.让我们一起talk C栗子吧! 我们在前 ...

  9. 第一百二十一节,JavaScript事件绑定及深入

    JavaScript事件绑定及深入 学习要点: 1.传统事件绑定的问题 2.W3C事件处理函数 3.IE事件处理函数 4.事件对象的其他补充 事件绑定分为两种:一种是传统事件绑定(内联模型,脚本模型) ...

随机推荐

  1. OpenCV2马拉松第12圈——直方图比較

    收入囊中 使用4种不同的方法进行直方图比較 葵花宝典 要比較两个直方图, 首先必需要选择一个衡量直方图相似度的对照标准.也就是先说明要在哪个方面做对照. 我们能够想出非常多办法,OpenCV採用了下面 ...

  2. 一、 Log4E插件下载

    下载地址:http://log4e.jayefem.de/content/view/3/2/ 二.安装Log4E插件 将下载下来的压缩包解压缩,如下图所示: 解压缩生成的[de.jayefem.log ...

  3. Appium+python自动化11-adb必知必会的几个指令

    前言 学android测试,adb是必学的,有几个常用的指令需要熟练掌握 一.检查设备 1.如何检查手机(或模拟器)是连上电脑的,在cmd输入: >adb devices

  4. 代码规范审查 -Sonar环境搭建

    Sonar概述 Sonar 是一个用于代码质量管理的开放平台,可以进行代码质量的持续跟踪审查,支持的语言包含C#.java.PHP.C等.可以通过UI一睹Sonar的强大之处. Sonar安装     ...

  5. C语言指针加1问题以及字节对齐问题

    今天早上自己写了一段代码,然后测试的时候发现结果总是和预期的不一样,而且偏差的有点离谱,冥思苦想了将近五个小时,最后在我要开始怀疑人生的时候,发现原来是自己犯了一个极其低级但又容易被忽略的问题.好吧, ...

  6. ZeroMQZeroMQ研究与应用分析

    1  ZeroMQ概述 ZeroMQ是一种基于消息队列的多线程网络库,其对套接字类型.连接处理.帧.甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接字.ZeroMQ是网络通信中新的一层,介于应用 ...

  7. session劫持技术

    目录: 0×00 应用程序认证设计背景0×01 常规攻击思路及缺陷0×02 利用应用程序设计缺陷进行Session劫持的攻击原理0×03 Session劫持的大致思路及意义0×04 如何防御这种攻击 ...

  8. go语言基础之 if else的使用

    一.if_else 示例1: package main //必须有一个main包 import "fmt" func main() { a := 11 if a == 10 { f ...

  9. mysql数据库维护(备份和还原)和性能提高

    为了有效防止数据丢失,并将损失降到最低,应对数据库服务器做维护.数据库维护,包括数据备份,还原,导出和导入操作. 1. MySQL数据库备份 所谓数据库维护,主要包含备份数据,还原数据和数据库迁移,对 ...

  10. SQLServer2008备份时发生无法打开备份设备

    如下图所示,在执行SQL一个简单的备份命令时发生下面的情况 问题分析: 1:可能是文件夹目录权限问题 2:可能是登录SQLServer服务器用户策略问题 于是就查看了E:\dw_backup的文件夹权 ...