7.6 C程序的存储空间布局

由于历史原因,C程序一直由下列几部分组成:

• 正文段。这是由CPU执行的机器指令部分。通常,正文段是可共享的,所以即使是经常执行的程序(如文本编辑程序、C编译程序、shell等)在存储器中也只需有一个副本,另外,正文段常常是只读的,以防止程序由于意外事故而修改其自身的指令。

• 初始化数据段(函数外)。通常将此段称为数据段,它包含了程序中需赋初值的变量。例如, C程序中任何函数之外的说明:

int maxcount = 99;

使此变量以初值存放在初始化数据段中。

• 非初始化数据段(函数外)。通常将此段称为bss段,这一名称来源于早期汇编程序的一个操作符,意思是“block started by symbol(由符号开始的块)”,在程序开始执行之前,内核将此段初始化为0或空指针。出现在任何函数外的C声明为:

long sum[1000] ;

使此变量存放在非初始化数据段中。

• 栈。自动变量以及每次函数调用时所需保存的信息都存放在此段中。每次函数调用时,其返回地址、以及调用者的环境信息(例如某些机器寄存器)都存放在栈中。然后,新被调用的函数在栈上为其自动和临时变量分配存储空间。通过以这种方式使用栈, C函数可以递归调用。递归函数每次调用自身时,就使用一个新的栈帧,因此一个函数调用实例中的变量集不会影响另一个函数调用实例中的变量。

• 堆。通常在堆中进行动态存储分配。由于历史上形成的惯例,堆位于非初始化数据段顶和栈底之间。

图7 - 3显示了这些段的一种典型安排方式。这是程序的逻辑布局—虽然并不要求一个具体实现一定以这种方式安排其存储空间但这是一种便于说明典型安排。

对于x86处理器上的Linux,正文段从0x08048000单元开始,栈底则在0xC0000000之下开始,在这种特定结构中,栈从高地址向低地址方向增长。堆顶和栈底之间未用的虚拟地址空间很大。

从上图可以看出,未初始化数据段的内容并不存放在磁盘上的程序文件中,原因是,内核在程序开始运行前将他们都设置为0。需要存放在程序文件中的段只有正文段和初始化数据段。

size ( 1 )命令报告正文段、数据段和b s s段的长度(单位:字节)。例如:

$ size /bin/cc /bin/sh

text     data    bss      dec     hex

81920 16384 664 98968 18298 /bin/cc

90112 16384 0 106496 1a000 /bin/sh

第4和第5列是分别以十进制和十六进制表示的总长度。

转载于:https://www.cnblogs.com/shaoguangleo/archive/2011/10/12/2806006.html

7.6 C程序的存储空间布局相关推荐

  1. C++程序的存储空间布局

    原文地址:http://ju-kevin.spaces.live.com/blog/cns!907BD90CD611C0C7!217.entry(已不能访问) 转载地址:http://blog.sin ...

  2. Linux size命令和C程序的存储空间布局

    size - list section sizes and total size是GNU Development Tools,列出目标文件各个部分所占的字节数,当不输入目标文件时,将会把a.out文件 ...

  3. C 程序的存储空间布局

    1. 存储空间布局 static int g_init = 1; // data 段 static int g_uninit; // bss 段int main() { static int s_in ...

  4. C程序的存储空间布局

    系统空间: 为内核保留,不允许应用程序读写该区域的内容或直接调用内核代码定义的函数. 内核总是驻留在内存中,是操作系统的一部分. 系统中所有进程对应的虚拟地址空间的内核区都会映射到同一块物理内存上(系 ...

  5. C语言存储空间布局以及static解析

    本文我将采用Linux环境测试C语言存储空间布局,以及采用VC6.0来测试static的常见用法.采用linux环境来测试c语言存储空间布局,是因为Linux很容易利用shell命令中的size命令查 ...

  6. C语言存储空间布局以及static详解

    本文我将采用Linux环境测试C语言存储空间布局,以及采用VC6.0来测试static的常见用法.采用Linux环境来测试C语言存储空间布局,是因为Linux很容易利用shell命令中的size命令查 ...

  7. C语言实现数据文件怎么找,急求如何将下列C语言程序数据存储到文件中?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 求如何改动才能将下列程序的存储输入或输出数据(或两者一起)到指定的文件(或运行时直接创立一个文件)如Arrangement中. #include int ...

  8. c语言程序怎么颠倒数据,急求如何将下列C语言程序数据存储到文件中?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 求如何改动才能将下列程序的存储输入或输出数据(或两者一起)到指定的文件(或运行时直接创立一个文件)如Arrangement中. #include int ...

  9. 如何保存文件为c语言格式,急求如何将下列C语言程序数据存储到文件中?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 求如何改动才能将下列程序的存储输入或输出数据(或两者一起)到指定的文件(或运行时直接创立一个文件)如Arrangement中. #include int ...

最新文章

  1. 利用 Cloudera 实现 Hadoop (一)
  2. 分享Kali Linux 2016.2第49周镜像文件
  3. HTML锚点控制,跳转页面后定位到相应位置
  4. html css常用样式
  5. hdu 3416(最短路+最大流)
  6. rocket-console控制台安装
  7. bizagi simulation 仿真学习
  8. 【英语学习】【Daily English】U14 Transportation L01There will be a car exhibition next month
  9. 实验三:跟踪分析Linux内核的启动过程
  10. tp摄像头的默认地址_tplink的ip默认地址是什么?
  11. 【字节跳动实习】后端日常实习的三次面试+hr面 面经
  12. 【LeetCode】跳步系列
  13. cesium-模型处理(FBX2GLTF)
  14. Velodyne VLP16激光雷达的使用(非常详细)
  15. Wannafly挑战赛4,C题割草机,(模拟)
  16. 一个BUG(缺陷)的生命周期
  17. STM32物联网项目-ADC采集实验板板温度(NTC热敏电阻)
  18. 云师大的计算机师范专业好吗,云南除了云南师范大学,还有这些实力不错的师范学校...
  19. 分枝限界法求解0/1背包问题
  20. kindle PC端有没有办法连续翻页?

热门文章

  1. python 制作高斯mask_Python中numpy如何生成mask图像
  2. 前端开发的壁垒在哪儿?
  3. 20210101:力扣第42周双周赛(上)
  4. php后端路由,laravel实现前后台路由分离的方法
  5. hive外部表/内部表路径知识点
  6. [通达信] 融维创富主图公式
  7. 从零学ELK系列(三):Centos安装Docker(超详细图文教程)
  8. 如何用JavaScript搭建神经网络?90分钟免费课程,上手可操作丨教程
  9. PyTorch 1.0稳定版正式发布,并向开发者提供免费AI课程
  10. 全球首个AI合成主播发布,效果以假乱真!揭秘背后技术原理