当前位置:  编程技术>c/c++/嵌入式

深入C语言内存区域分配(进程的各个段)详解

    来源: 互联网  发布时间:2014-10-17

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

C语言可执行代码结构

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

(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
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%08xn", &g_A);
    printf("n");
    printf( "数据段,全局变量,       初始化      g_B,     addr:0x%08xn", &g_B);
    printf( "数据段,静态全局变量,   初始化,     g_C,     addr:0x%08xn", &g_C);
    printf("n");
    printf( "BSS段, 全局变量,       未初始化    g_E,     addr:0x%08xn", &g_E, g_E );   
    printf( "BSS段, 静态全局变量,   未初始化,   g_D,     addr:0x%08xn", &g_D );
    printf( "BSS段, 静态局部变量,   初始化,     local_C, addr:0x%08xn", &local_C);
    printf( "BSS段, 静态局部变量,   未初始化,   local_D, addr:0x%08xn", &local_D);
    printf("n");
    printf( "栈,    局部变量,                   local_A, addr:0x%08xn", &local_A );
    printf("n");
    printf( "堆,    malloc分配内存,             p1,      addr:0x%08xn", p1 );
}


    
 
 

您可能感兴趣的文章:

  • 深入JDBC sqlserver连接写法的详解
  • 深入mysql YEAR() MONTH() DAYOFMONTH()日期函数的详解
  • 深入SQLServer中ISNULL与NULLIF的使用详解
  • 深入C++可见性与生命期的区别详解
  • 深入mysql并发插入优化详解
  • 深入android Unable to resolve target 'android-XX'详解
  • 深入MYSQL字符数字转换的详解
  • 深入SQL Server中定长char(n)与变长varchar(n)的区别详解
  • 深入C#任务管理器中应用程序选项隐藏程序本身的方法详解
  • 深入Windows下的回车是回车换行(rn)还是换行回车(nr)的详解
  • 深入分析NTFS中文件被锁定导致Process.Start失败的详解
  • 深入C# 内存管理以及优化的方法详解
  • 深入c# Func委托的详解
  • 深入分析Java内存区域的使用详解
  • Informatica bulk与normal模式的深入详解
  • 深入JAVA对象深度克隆的详解
  • 深入mysql存储过程中表名使用参数传入的详解
  • 深入SQL截取字符串(substring与patindex)的详解
  • 深入Java不可变类型的详解
  • 深入Android开发FAQ的详解
  • 深入分析父子线程、进程终止顺序不同产生的结果
  • 深入探讨linux下进程的最大线程数、进程最大数、进程打开的文件数
  • 解析C#中用Process类杀死进程,执行命令的深入分析
  • 进程间通信之深入消息队列的详解
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 二维指针动态分配内存连续问题深入分析
  • 基于C++内存分配、函数调用与返回值的深入分析
  • Docker支持更深入的容器日志分析
  • 关于《深入浅出MFC》
  • Linux有没有什么好的高级的书,我要深入,
  • 深入理解linux内核
  • [100分]有没有关于binutils的深入的资料?或者深入底层的资料?
  • 深入理解PHP内核 TIPI
  • 想深入学习Java应该学习哪些东西
  • 哪位有《JSP深入编程》电子版?
  • 想要深入学习LINUX该学什么?
  • 100分求:哪儿有《深入理解linux内核》可供下哉!
  • 如何深入Linux的内核学习?
  • U-BOOT得掌握到什么程序,用不用深入去学
  • 想深入了解操作系统该怎么做
  • 前一阵子学习了shell脚本,如果想深入点了解linux可以看什么书呢
  • 问一个《深入理解计算机系统》中的问题
  • 深入多线程之:深入分析Interlocked
  • ##想买书深入学习linux下的编程,请指教
  • 深入oracle特定信息排序的分析
  • 深入分析C中不安全的sprintf与strcpy
  • 哪儿有下载《深入理解Linux内核》这本书?(中文)
  • Web服务器/前端 iis7站长之家


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3