源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-11-11 05:21 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:深入C语言内存区域分配(进程的各个段)详解
[b]C语言可执行代码结构 [/b]
[b]名称[/b] [b]内容 [/b]
[b]代码段[/b] [b] 可执行代码、字符串常量[/b]
[b]数据段[/b] [b] 已初始化全局变量、已初始化全局静态变量、局部静态变量、常量数据[/b]
[b]BSS段[/b] [b] 未初始化全局变量,未初始化全局静态变量[/b]
[b]栈[/b] [b] 局部变量、函数参数[/b]
[b]堆[/b] [b] 动态内存分配[/b]
[b](1)代码段(text segment):[/b]存放CPU执行的机器指令。通常代码段是可共享的,这使得需要频繁被执行的程序只需要在内存中拥有一份拷贝即可。代码段也通常是只读的,这样可以防止其他程序意外地修改其指令。另外,代码段还规划了局部数据所申请的内存空间信息。 代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。 [b](2)数据段(data segment):[/b]或称全局初始化数据段/静态数据段(initialized data segment/data segment)。该段包含了在程序中明确被初始化的全局变量、静态变量(包括全局静态变量和局部静态变量)和常量数据。 [b](3)未初始化数据段:[/b]亦称BSS(Block Started by Symbol)。该段存入的是全局未初始化变量、静态未初始化变量。 而当程序被加载到内存单元时,则需要另外两个域:堆域和栈域。 [b](4)栈段(stack):[/b]存放函数的参数值、局部变量的值,以及在进行任务切换时存放当前任务的上下文内容。 [b](5)堆段(heap):[/b]用于动态内存分配,即使用malloc/free系列函数来管理的内存空间。 在将应用程序加载到内存空间执行时,操作系统负责代码段、数据段和BSS段的加载,并将在内存中为这些段分配空间。栈段亦由操作系统分配和管理,而不需要程序员显示地管理;堆段由程序员自己管理,即显示地申请和释放空间。 另外,可执行程序在运行时具有相应的程序属性。在有操作系统支持时,这些属性页由操作系统管理和维护。 [b]下面给出示例程序代码,注释已经在代码中写明: [/b]
[u]复制代码[/u] 代码如下:
/*代码段、数据段和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:0xx\n", &g_A);     printf("\n");     printf( "数据段,全局变量,       初始化      g_B,     addr:0xx\n", &g_B);     printf( "数据段,静态全局变量,   初始化,     g_C,     addr:0xx\n", &g_C);     printf("\n");     printf( "BSS段, 全局变量,       未初始化    g_E,     addr:0xx\n", &g_E, g_E );        printf( "BSS段, 静态全局变量,   未初始化,   g_D,     addr:0xx\n", &g_D );     printf( "BSS段, 静态局部变量,   初始化,     local_C, addr:0xx\n", &local_C);     printf( "BSS段, 静态局部变量,   未初始化,   local_D, addr:0xx\n", &local_D);     printf("\n");     printf( "栈,    局部变量,                   local_A, addr:0xx\n", &local_A );     printf("\n");     printf( "堆,    malloc分配内存,             p1,      addr:0xx\n", p1 ); }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部