一起talk C栗子吧(第一百三十一回:C语言实例--C程序内存布局三)
各位看官们,大家好。上一回中咱们说的是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程序内存布局三)的更多相关文章
- 一起talk C栗子吧(第一百二十一回:C语言实例--线程知识体系图)
各位看官们.大家好,上一回中咱们说的线程属性的样例.这一回咱们说的样例是:线程知识体系图.闲话休提.言归正转. 让我们一起talk C栗子吧! 我们在前面的章回中介绍了与线程相关的知识,在今天的章回中 ...
- PIC12F629帮我用C语言写个程序,控制三个LED亮灭
http://power.baidu.com/question/240873584599025684.html?entry=browse_difficult PIC12F629帮我用C语言写个程序,控 ...
- 一起talk C栗子吧(第一百二十三回:C语言实例--显示变量和函数的地址)
各位看官们,大家好,上一回中咱们说的是多线程的样例.这一回咱们说的样例是:显示变量和函数的地址. 闲话休提,言归正转.让我们一起talk C栗子吧! 在编敲代码时,有时候须要获取程序中变量和函数的地址 ...
- [你必须知道的.NET]第三十一回,深入.NET 4.0之,从“新”展望
发布日期:2009.05.22 作者:Anytao © 2009 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. /// <summary> /// 本文开始,将以& ...
- C语言实例-能组成多少个三位数?
题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. 源代码: #i ...
- 一起talk C栗子吧(第十二回:C语言实例--单链表一)
各位看官们,大家好.从今天開始,我们讲大型章回体科技小说 :C栗子.也就是C语言实例.闲话休提, 言归正转. 让我们一起talk C栗子吧! 看官们,上一回中咱们没有说详细的样例,并且是说了样例中的文 ...
- 一起talk C栗子吧(第一百二十七回:C语言实例--查看main函数的參数)
各位看官们,大家好,上一回中咱们说的是static关键字的样例,这一回咱们说的样例是:查看main函数的參数.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们.我们在第五十七回中介绍过mai ...
- 一起talk C栗子吧(第九十回:C语言实例--使用管道进行进程间通信三)
各位看官们,大家好,上一回中咱们说的是使用管道进行进程间通信的样例.这一回咱们说的样例是:使用管道进行进程间通信.只是使用管道的方式不同样.闲话休提,言归正转.让我们一起talk C栗子吧! 我们在前 ...
- 第一百二十一节,JavaScript事件绑定及深入
JavaScript事件绑定及深入 学习要点: 1.传统事件绑定的问题 2.W3C事件处理函数 3.IE事件处理函数 4.事件对象的其他补充 事件绑定分为两种:一种是传统事件绑定(内联模型,脚本模型) ...
随机推荐
- OpenCV2马拉松第12圈——直方图比較
收入囊中 使用4种不同的方法进行直方图比較 葵花宝典 要比較两个直方图, 首先必需要选择一个衡量直方图相似度的对照标准.也就是先说明要在哪个方面做对照. 我们能够想出非常多办法,OpenCV採用了下面 ...
- 一、 Log4E插件下载
下载地址:http://log4e.jayefem.de/content/view/3/2/ 二.安装Log4E插件 将下载下来的压缩包解压缩,如下图所示: 解压缩生成的[de.jayefem.log ...
- Appium+python自动化11-adb必知必会的几个指令
前言 学android测试,adb是必学的,有几个常用的指令需要熟练掌握 一.检查设备 1.如何检查手机(或模拟器)是连上电脑的,在cmd输入: >adb devices
- 代码规范审查 -Sonar环境搭建
Sonar概述 Sonar 是一个用于代码质量管理的开放平台,可以进行代码质量的持续跟踪审查,支持的语言包含C#.java.PHP.C等.可以通过UI一睹Sonar的强大之处. Sonar安装 ...
- C语言指针加1问题以及字节对齐问题
今天早上自己写了一段代码,然后测试的时候发现结果总是和预期的不一样,而且偏差的有点离谱,冥思苦想了将近五个小时,最后在我要开始怀疑人生的时候,发现原来是自己犯了一个极其低级但又容易被忽略的问题.好吧, ...
- ZeroMQZeroMQ研究与应用分析
1 ZeroMQ概述 ZeroMQ是一种基于消息队列的多线程网络库,其对套接字类型.连接处理.帧.甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接字.ZeroMQ是网络通信中新的一层,介于应用 ...
- session劫持技术
目录: 0×00 应用程序认证设计背景0×01 常规攻击思路及缺陷0×02 利用应用程序设计缺陷进行Session劫持的攻击原理0×03 Session劫持的大致思路及意义0×04 如何防御这种攻击 ...
- go语言基础之 if else的使用
一.if_else 示例1: package main //必须有一个main包 import "fmt" func main() { a := 11 if a == 10 { f ...
- mysql数据库维护(备份和还原)和性能提高
为了有效防止数据丢失,并将损失降到最低,应对数据库服务器做维护.数据库维护,包括数据备份,还原,导出和导入操作. 1. MySQL数据库备份 所谓数据库维护,主要包含备份数据,还原数据和数据库迁移,对 ...
- SQLServer2008备份时发生无法打开备份设备
如下图所示,在执行SQL一个简单的备份命令时发生下面的情况 问题分析: 1:可能是文件夹目录权限问题 2:可能是登录SQLServer服务器用户策略问题 于是就查看了E:\dw_backup的文件夹权 ...