一起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.事件对象的其他补充 事件绑定分为两种:一种是传统事件绑定(内联模型,脚本模型) ...
随机推荐
- Registering DLL and ActiveX controls from code
http://delphi.about.com/od/windowsshellapi/l/aa040803a.htm How to register (and unregister) OLE cont ...
- JSP页面乱码全解析
乱码指的是中文乱码. 一.POST乱码 由于两个页面都是用UTF-8编码,但是参数的传输默认是ISO-8859-1,这时候可以在接受参数之前 request.setCharacterEncoding( ...
- CAS3.5.x(x>1)支持OAuth2 server
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- vsftpd FTP服务器配置
步骤如下: 0. 进入目录/etc/vsftpd,将vsftpd.conf备份为vsftpd.conf.bak(否则启动时会启动这个)1. 进入目录/etc/vsftpd,创建文件myserver.c ...
- End of Life check fails with NullPointerException
Checks if the running version of JIRA is approaching, or has reached End of Life. Details Type: Bug ...
- gdb对应vc调试命令
gdb vc调试对照表: 实现功能 vc gdb 修改后编译 f7 ma ...
- MVC4 过滤器(转)
先来看看一个例子演示过滤器有什么用: public class AdminController : Controller { // ... instance variables and constru ...
- Nescafé2 月之谜 题解
月之谜 (mystery.pas/c/cpp) [题目描述] 打败了 Lord lsp 之后,由于 lqr 是一个心地善良的女孩子,她想净化 Lord lsp 黑化的心,使他变回到原来那个天然呆的 l ...
- Proxmark3介绍
Proxmark3介绍 Proxmark3是由Jonathan Westhues设计并且开发的开源硬件,其主要用RFID的嗅探.读取以及克隆等的操作. 其官方网站为:Jonathan Westhues ...
- 第一章 consul简介
1.consul的作用 服务发现 Consul clients提供服务(例如API) 其他的client发现服务的提供者(通过DNS或http,应用可以轻松的发现他们所依赖的服务) 健康检查 Key- ...