一起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.事件对象的其他补充 事件绑定分为两种:一种是传统事件绑定(内联模型,脚本模型) ...
随机推荐
- MatLab角点检測(harris经典程序)
http://blog.csdn.net/makenothing/article/details/12884331 这是源博客的出处,鄙人转过来是为了更好的保存!供大家一起学习!已将原始的博客的文章的 ...
- GNU make 指南
http://docs.huihoo.com/gnu/linux/gmake.html GNU make 指南 翻译: 哈少 译者按: 本文是一篇介绍 GNU Make 的文章,读完后读者应该基本掌握 ...
- 调整设置 Win7休眠文件“Hiberfil.sys”
1. 显示并查看Hiberfil.sys文件
- Python break 语句
Python break 语句 Python break语句,就像在C语言中,打破了最小封闭for或while循环. break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归 ...
- cocos2d-x 中文乱码问题解决方案
在windows环境下使用visual studio 开发cocos2d-x,由于visual studio 默认编码为GBK 格式,而cocos2d-x引擎默认编码为UTF-8, 如果有用到中文,在 ...
- 深入JavaScript模块化编程
今天看requirejs官网的manual,发现了下面这篇好文章,于是花点时间翻译了一下,翻译不好的地方请指正,谢谢! 推荐阅读原文:) http://www.adequatelygood.com ...
- iOS:CoreData数据库的使用四(数据库和UITableViewController以及NSFetchedResultsController一起使用)
CoreData数据库虽然可以和tableview或者UITableViewController一起使用将数据显示在表格上,但是在准备数据的时候,这种方式需要用一个可变数组来装从数据库一次性取出来的所 ...
- DedeCms V5.6 plus/advancedsearch.php 任意sql语句执行漏洞
漏洞版本: DedeCms V5.6 漏洞描述: DedeCMS内容管理系统软件采用XML名字空间风格核心模板:模板全部使用文件形式保存,对用户设计模板.网站升级转移均提供很大的便利,健壮的模板标签为 ...
- go语言基础之局部变量特点
1.局部变量特点 示例1: package main import "fmt" func main() { //定义在{}里面的变量就是局部变量,只能在{}里面有效 //执行到定义 ...
- 使用javascript比较任意两个日期相差天数(代码)
avascript比较两个日期相差天数,可返回负值,表示后者大于前者. 该函数在IE,firefox下均通过测试. /** 比较两个日期相差的天数,可为负值 **/ function DateDiff ...