C语言可执行代码结构


 名称 内容
代码段  可执行代码、字符串常量
数据段  已初始化全局变量、已初始化全局静态变量、局部静态变量、常量数据
BSS段  未初始化全局变量,未初始化全局静态变量
 局部变量、函数参数
 动态内存分配


        一般情况下,一个可执行二进制程序(更确切的说,在Linux操作系统下为一个进程单元,在UC/OSII中被称为任务)在存储(没有调入到内存运行)时拥有3个部分,分别是代码段(text)、数据段(data)和BSS段。这3个部分一起组成了该可执行程序的文件。

        (1)代码段(text segment):存放CPU执行的机器指令。通常代码段是可共享的,这使得需要频繁被执行的程序只需要在内存中拥有一份拷贝即可。代码段也通常是只读的,这样可以防止其他程序意外地修改其指令。另外,代码段还规划了局部数据所申请的内存空间信息。

        代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

        (2)数据段(data segment):或称全局初始化数据段/静态数据段(initialized data segment/data segment)。该段包含了在程序中明确被初始化的全局变量、静态变量(包括全局静态变量和局部静态变量)和常量数据。

        (3)未初始化数据段:亦称BSS(Block Started by Symbol)。该段存入的是全局未初始化变量、静态未初始化变量。

        而当程序被加载到内存单元时,则需要另外两个域:堆域和栈域。

        (4)栈段(stack):存放函数的参数值、局部变量的值,以及在进行任务切换时存放当前任务的上下文内容。

        (5)堆段(heap):用于动态内存分配,即使用malloc/free系列函数来管理的内存空间。

     在将应用程序加载到内存空间执行时,操作系统负责代码段、数据段和BSS段的加载,并将在内存中为这些段分配空间。栈段亦由操作系统分配和管理,而不需要程序员显示地管理;堆段由程序员自己管理,即显示地申请和释放空间。

    另外,可执行程序在运行时具有相应的程序属性。在有操作系统支持时,这些属性页由操作系统管理和维护。


下面给出示例程序代码,注释已经在代码中写明:

/*代码段、数据段和BSS段存储变量类型*/
#include <stdio.h>
const int    g_A       = 10;            //代码段
int            g_B       = 20;            //数据段
static int    g_C       = 30;            //数据段
static int    g_D;                    //BSS段
int            g_E;                    //BSS段
char        *p1;                    //BSS段void main( )
{int           local_A;            //栈static int    local_C = 0;        //数据段static int    local_D;            //数据段char        *p3 = "123456";     //123456在代码段,p3在栈上p1 = (char *)malloc( 10 );      //堆,分配得来得10字节的区域在堆区strcpy( p1, "123456" );         //123456{post.content}放在常量区,编译器可能会将它与p3所指向 的"123456"优化成一块printf("\n");printf( "代码段,全局初始化变量, 只读const,  g_A,     addr:0x%08x\n", &g_A);printf("\n");printf( "数据段,全局变量,       初始化      g_B,     addr:0x%08x\n", &g_B);printf( "数据段,静态全局变量,   初始化,     g_C,     addr:0x%08x\n", &g_C);printf("\n");printf( "BSS段, 全局变量,       未初始化    g_E,     addr:0x%08x\n", &g_E, g_E );    printf( "BSS段, 静态全局变量,   未初始化,   g_D,     addr:0x%08x\n", &g_D );printf( "BSS段, 静态局部变量,   初始化,     local_C, addr:0x%08x\n", &local_C);printf( "BSS段, 静态局部变量,   未初始化,   local_D, addr:0x%08x\n", &local_D);printf("\n");printf( "栈,    局部变量,                   local_A, addr:0x%08x\n", &local_A );printf("\n");printf( "堆,    malloc分配内存,             p1,      addr:0x%08x\n", p1 );
}

C 语言内存区域分配(进程的各个段)详解相关推荐

  1. c语言中注释部分执行,深入C语言内存区域分配(进程的各个段)详解

    C语言可执行代码结构名称 内容 代码段 可执行代码.字符串常量 数据段 已初始化全局变量.已初始化全局静态变量.局部静态变量.常量数据 BSS段 未初始化全局变量,未初始化全局静态变量 栈 局部变量. ...

  2. c语言除法在全局区,深入C语言内存区域分配(进程的各个段)详解

    C语言可执行代码结构 名称 内容 代码段 可执行代码.字符串常量 数据段 已初始化全局变量.已初始化全局静态变量.局部静态变量.常量数据 BSS段 未初始化全局变量,未初始化全局静态变量 栈 局部变量 ...

  3. 程序内存区域分配(五个段)--终于搞明白了

    在学习之前我们先看看ELF文件. ELF分为三种类型:.o 可重定位文件(relocalble file),可执行文件以及共享库(shared library),三种格式基本上从结构上是一样的,只是具 ...

  4. JVM实战与原理---内存区域分配

    JVM实战与原理 目录 内存区域分配 1. 程序计数器 2. Java虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区 6. 运行时常量池 内存区域分配 章节目的:明白虚拟机中的内存是如何划分?每块 ...

  5. c语言中getenv的作用,C语言putenv()函数和getenv()函数的使用详解

    C语言putenv()函数和getenv()函数的使用详解 C语言putenv()函数:改变或增加环境变量头文件: #include4 定义函数: int putenv(const char * st ...

  6. C语言0长度数组(可变数组/柔性数组)详解

    CSDN GitHub C语言0长度数组(可变数组/柔性数组)详解 AderXCoding/language/c/zero_length_array 本作品采用知识共享署名-非商业性使用-相同方式共享 ...

  7. 进程和线程的详解和区别

    1 进程和线程概述 我们都知道计算机的核心是CPU,它承担了所有的计算任务,而操作系统是计算机的管理者,它负责任务的调度,资源的分配和管理,统领整个计算机硬件:应用程序是具有某种功能的程序,程序是运行 ...

  8. time库是python中处理时间的标准库_python语言time库和datetime库基本使用详解

    今天是边复习边创作博客的第三天,我今年大二,我们专业开的有这门课程,因为喜欢所以更加认真学习,本以为没人看呢,看了后台浏览量让我更加认真创作,这篇博客花了2个半小时的时间,结合自己所学,所思,所想写作 ...

  9. R语言基于forestplot包可视化森林图实战详解:美化的森林图:自定义字体设置、置信区间、坐标轴(刻度、标签、范围)、无效线去除、水平线、辅助线、box形状、色彩等

    R语言基于forestplot包可视化森林图实战详解:美化的森林图:自定义字体设置.置信区间.坐标轴(刻度.标签.范围).无效线去除.水平线.辅助线.box形状.色彩等 目录

最新文章

  1. os的进程调度(读书笔记)
  2. 应该算是在说 delphi 的日志框架吧
  3. 台式机dp接口_精品导购:你想要的商务台式机 都在这里了!
  4. [leetcode] 472. 连接词
  5. [转载] Python 中使用help()命令后如何退出
  6. Flink 的应用场景和架构模型
  7. 代码对比工具Sublime——Sublimerge
  8. php base64原理
  9. 企业微信发送消息php,PHP实现微信模板消息发送给指定用户
  10. ctfshow - PNG隐写入门赛
  11. Citavi系列之Word参考文献APA转LaTeX Bib文件
  12. 为什么公司宁愿花15k去重招一个应届生,也不愿意加薪5k留住老程序员?
  13. StataIC——短面板数据分析(以检验啤酒税将降低交通死亡率的假说为例)
  14. 【CS学习笔记】26、杀毒软件
  15. 金融相关计算机面试题,银行及其他金融企业笔试和面试经验
  16. ShowWindow不起作用
  17. 关于SQL注入靶场搭建及过关教程
  18. 电气器件系列三十二:电缸
  19. html保存到桌面的代码,H5创建webApp保存到桌面(代码教程)
  20. Numpy简易教程8——简易分析

热门文章

  1. 【正则表达式系列】一些概念(字符组、捕获组、非捕获组)
  2. redis入门及java操作
  3. PLMN概念和应用设置
  4. 财会小白的办公室自救指南
  5. Redis存储总用String?你大概错过了更优的使用方法
  6. “云上金融,智创未来” 腾讯“云+未来”峰会金融专场在广州举行
  7. 【React、Vue 、 Angular 共分天下,2018首将会是谁?】
  8. Install Oracle Instant Client on Linux and Windows
  9. web项目错误页面友好处理404,500等
  10. 【NOIP】提高组2015 神奇的幻方