c 语言内存区域分配(进程的各个段)详解-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 1125330
  • 博文数量: 146
  • 博客积分: 190
  • 博客等级: 入伍新兵
  • 技术积分: 5225
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-06 08:24
个人简介

慢行者

文章分类

全部博文(146)

文章存档

2013年(145)

2012年(1)

相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: c/c

2013-09-16 09:04:55

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段的加载,并将在内存中为这些段分配空间。栈段亦由操作系统分配和管理,而不需要程序员显示地管理;堆段由程序员自己管理,即显示地申请和释放空间。

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


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

[cpp]
  1. /*代码段、数据段和bss段存储变量类型*/  
  2. #include   
  3. const int    g_a       = 10;            //代码段  
  4. int            g_b       = 20;            //数据段  
  5. static int    g_c       = 30;            //数据段  
  6. static int    g_d;                    //bss段  
  7. int            g_e;                    //bss段  
  8. char        *p1;                    //bss段  
  9.   
  10. void main( )  
  11. {  
  12.     int           local_a;            //栈  
  13.     static int    local_c = 0;        //数据段  
  14.     static int    local_d;            //数据段  
  15.       
  16.     char        *p3 = "123456";     //123456在代码段,p3在栈上  
  17.   
  18.     p1 = (char *)malloc( 10 );      //堆,分配得来得10字节的区域在堆区  
  19.     strcpy( p1, "123456" );         //123456{post.content}放在常量区,编译器可能会将它与p3所指向 的"123456"优化成一块  
  20.     printf("\n");  
  21.     printf( "代码段,全局初始化变量, 只读const,  g_a,     addr:0xx\n", &g_a);  
  22.     printf("\n");  
  23.     printf( "数据段,全局变量,       初始化      g_b,     addr:0xx\n", &g_b);  
  24.     printf( "数据段,静态全局变量,   初始化,     g_c,     addr:0xx\n", &g_c);  
  25.     printf("\n");  
  26.     printf( "bss段, 全局变量,       未初始化    g_e,     addr:0xx\n", &g_e, g_e );      
  27.     printf( "bss段, 静态全局变量,   未初始化,   g_d,     addr:0xx\n", &g_d );  
  28.     printf( "bss段, 静态局部变量,   初始化,     local_c, addr:0xx\n", &local_c);  
  29.     printf( "bss段, 静态局部变量,   未初始化,   local_d, addr:0xx\n", &local_d);  
  30.     printf("\n");  
  31.     printf( "栈,    局部变量,                   local_a, addr:0xx\n", &local_a );  
  32.     printf("\n");  
  33.     printf( "堆,    malloc分配内存,             p1,      addr:0xx\n", p1 );  
  34. }  
阅读(4028) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图