一个C语言程序一直以来都是由以下5个段组成:

1、代码段(text segmrnt):存放CPU执行的机器指令,通常情况下,代码段是可共享的,使其可共享的目的是对于频繁被执行的程序,只需要在没存中有有一份拷贝即可,比如文本编辑器,c编辑器,shell等等。另外,代码段也通常是只读的,使其只读的原因是防止一个程序意外地修改了它的指令。

2、初始化数据段/数据段(initialized data segment/data segmrnt): 该段包括了在程序中明确被初始化的变量。

3、未初始化数据段/bss段(uninitialized data segment/"bss" segment):bss 这个叫法是根据一个早期的汇编运算符而来,这个运算符标志着一个块的开始(stood for "block starded by symbol")。在程序开始执行之前,bss段的数据被kernel初始化为0或者空指针。

4、栈段(stack):每次当一个函数被调用,该函数的返回地址和一些关于caller的信息,比如某些寄存器的内容,将被首先存储到栈段。然后这个被调用的函数再为它的自动变量和临时变量在栈段上分配空间。这就是C如何实现函数的递归调用。每次一个递归函数调用其本身,一个新的栈框架就会被使用,这样这个新实例栈里的一组变量就不会和该函数的另一个实例栈里面的变量互相干扰。

5、堆段(heap):用于动态内存分配。一直以来,堆在内存中的位置是介于bss段和栈段之间。

运行在Inter x86处理器上的linux,代码段从地址开始往上,栈底从地址往下(在这个特定的表示结构中,栈段从高地址向低地址扩展)。在堆顶和栈顶之间的虚拟地址空间是很大的(这保证了2个段不会互相干扰)。

【面经】【转】C程序的内存布局的更多相关文章

  1. Anatomy of a Program in Memory.剖析程序的内存布局

    原文标题:Anatomy of a Program in Memory 原文地址:http://duartes.org/gustavo/blog/ [注:本人水平有限,只好挑一些国外高手的精彩文章翻译 ...

  2. C语言程序的内存布局

    C语言程序的内存布局 一:C语言程序的存储区域 C语言编写的程序经过编绎-链接后,将形成一个统一的文件,它由几个部分组成,在程序运行时又会产生几个其他部分,各个部分代表了不同的存储区域: 1.代码段( ...

  3. Linux 上 C 程序的内存布局

    在仔细研究这个问题之前,我认为 C 程序在内存中只有代码段,堆和栈三部分构成.前几天面试被问到了这个问题,才发现自己的印象是不完全的. 在本文中通过解析析一个 C 程序中变量和函数的地址来分析 C 程 ...

  4. ESP32应用程序的内存布局

    应用程序内存布局 ESP32芯片具有灵活的内存映射功能.本节介绍ESP-IDF在默认情况下如何使用这些功能. ESP-IDF中的应用程序代码可以放置在以下内存区域之一中. IRAM(指令RAM) ES ...

  5. c++内存布局与c程序的内存布局

    c/c++的内存布局:堆,栈,自由存储区(与堆的区别),全局/静态存储区,常量存储区(字符串常量,const常量) http://www.cnblogs.com/QG-whz/p/5060894.ht ...

  6. Linux下C程序的内存布局

    参考下列书籍中的对应章节: <Linux高级程序设计(第3版)>第3章Linux进程存储管理.相关视频:一.二. <C专家编程>第6章 运动的诗章:运行时数据结构. <U ...

  7. C程序的内存布局

     1.代码段(code或text): 通常是指用来存放程序执行代码的一块内存区域.这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读. 某些架构也允许代码段为可写,即允许修改程序.在代码 ...

  8. linux下C/C++程序的内存布局

    内核空间和用户空间: 我们在编写程序时使用的内存空间叫虚拟内存,程序在运行时,要完成虚拟内存到物理内存的转换.假如在32位环境上,理论上我们可以使用的虚拟内存空间是4GB,但实际上这4GB并不能完全给 ...

  9. 一起talk C栗子吧(第一百三十一回:C语言实例--C程序内存布局三)

    各位看官们,大家好.上一回中咱们说的是C程序内存布局的样例,这一回咱们继续说该样例.闲话休提,言归正转.让我们一起talk C栗子吧. 看官们,关于C程序内存布局的样例,我们在前面的两个章回都介绍过了 ...

随机推荐

  1. 未将对象引用设置到对象的实例 启用 JIT 调试后,任何无法处理的异常

    严谨!!!! DataSet ds = salarySum.GetDataSalarySum2(libUser.SelectedValue, dtpMonth.Value.Date);         ...

  2. 史上最全web.xml配置文件元素详解

    一.web.xml配置文件常用元素及其意义预览 <web-app> <!--定义了WEB应用的名字--> <display-name></display-na ...

  3. Android笔记:菜单

    1.按键调出菜单 public boolean onCreateOptionsMenu(Menu menu) 重写建立菜单方法 public boolean onOptionsItemSelected ...

  4. 群内大神与你交流WEB经验 业内专家指点就职技巧

    就知道你是一个有理想要抱负的人,不会满足于做一个初级的前端开发工程师.在接下来的这个阶段,我们将走上前端开发的进阶之路,将自己的能力再往上拔高一个等级.同样,薪资也会往上升一个等级!但是,如果你是一个 ...

  5. windows一个目录下最大文件数目

    对于FAT16文件系统, 可以保存的文件体积最大值是 4 GB - 1 byte (2^32 bytes - 1 byte): 卷的最大体积是4GB:每个卷上最多可以保存的文件数量是65,536个 ( ...

  6. MysqlDumpslow

    可以帮助分析慢查询. 选项: -n 10 列出最近10条慢查询 如: mysqldumpslow

  7. hdu 2602

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 #include<cstdio> #include<iostream> ...

  8. 三、jQuery--jQuery实践--瀑布流布局

    实现方法: 1.JavaScript 2.jQuery 3.CSS多栏布局 法一: window.onload=function(){ waterfall('main','pin'); var dat ...

  9. history 清空历史记录 或 history不记录历史命令

    # vi ~/.bash_history 清空里面的记录,并退出当前shell # exit(一定要退出当前shell) # history 1 vi ~/.bash_history 2 histor ...

  10. MVC缓存02,使用数据层缓存,添加或修改时让缓存失效

    在"MVC缓存01,使用控制器缓存或数据层缓存"中,在数据层中可以设置缓存的有效时间.但这个还不够"智能",常常希望在编辑或创建的时候使缓存失效,加载新的数据. ...