手机
当前位置:查字典教程网 >编程开发 >C语言 >深入C语言内存区域分配(进程的各个段)详解
深入C语言内存区域分配(进程的各个段)详解
摘要: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 <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%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 );

}

【深入C语言内存区域分配(进程的各个段)详解】相关文章:

深入C/C++浮点数在内存中的存储方式详解

C语言main函数的参数及其返回值详细解析

深入单链表的快速排序详解

深入c语言continue和break的区别详解

基于C语言中段错误的问题详解

共用体的定义与应用详细解析

深入C++中API的问题详解

深入分析Visual C++进行串口通信编程的详解

深入理解链表的各类操作详解

你必须知道的C语言预处理的问题详解

精品推荐
分类导航