C语言内存区域分配
来源:互联网 发布:php copy 编辑:程序博客网 时间:2024/05/22 13:45
阅读Unix环境高级编程的时候,读到了程序存储空间分配,借鉴了网上的一些资料总结如下:
一、C语言可执行代码结构
一般情况下,一个可执行二进制程序(更确切的说,在Linux操作系统下为一个进程单元,在UC/OSII中被称为任务)在存储(没有调入到内存运行)时拥有3个部分,分别是代码段(text)、数据段(data)和BSS段。这3个部分一起组成了该可执行程序的文件。
(1)代码段(text segment):
Unix环境高级编程称为正文段,存放CPU执行的机器指令。通常代码段是可共享的,这使得需要频繁被执行的程序只需要在内存中拥有一份拷贝即可。代码段也通常是只读的,这样可以防止其他程序意外地修改其指令。另外,代码段还规划了局部数据所申请的内存空间信息。 代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
(2)数据段(data segment):
或称全局初始化数据段/静态数据段(initialized data segment/data segment)。该段包含了在程序中明确被初始化的全局变量、静态变量(包括全局静态变量和局部静态变量)和常量数据。
(3)未初始化数据段:
亦称BSS(Block Started by Symbol)。该段存入的是全局未初始化变量、静态未初始化变量。而当程序被加载到内存单元时,则需要另外两个域:堆域和栈域。图1-1所示为可执行代码存储态和运行态的结构对照图。一个正在运行的C程序占用的内存区域分为代码段、初始化数据段、未初始化数据段(BSS)、堆、栈5个部分。
(4)栈段(stack):
存放函数的参数值、局部变量的值,以及在进行任务切换时存放当前任务的上下文内容。
(5)堆段(heap):
用于动态内存分配,即使用malloc/free系列函数来管理的内存空间。
在将应用程序加载到内存空间执行时,操作系统负责代码段、数据段和BSS段的加载,并将在内存中为这些段分配空间。栈段亦由操作系统分配和管理,而不需要程序员显示地管理;堆段由程序员自己管理,即显示地申请和释放空间。
测试代码如下:
#include <stdio.h>#include <string.h>#include <stdlib.h>const int global_one = 10; //代码段int global_two = 20; //数据段static int global_three = 30; //数据段static int global_four; //BSS段int global_five; //BSS段char *pa; //BSS段int main( ){int local_one; //栈 static int local_two = 0; //数据段 static int local_three; //数据段 char *pb = "1234567"; //1234567在代码段,pb在栈上pa = (char *)malloc( 10 ); //堆 strcpy( pa, "1234567" ); //1234567放在常量区printf("==========txt segment=============\n");printf( "global_one ,addr:%p\n", &global_one);printf("\n==========data segment==========\n");printf( "global_two ,addr:%p\n", &global_two);printf( "global_three ,addr:%p\n", &global_three);printf( "local_two ,addr:%p\n", &local_two);printf( "local_three ,addr:%p\n", &local_three);printf("\n=============BBS===============\n");printf( "global_four ,addr:%p\n", &global_four);printf( "global_five ,addr:%p\n", &global_five);printf( "pa ,addr:%p\n", pa);printf("\n=============stack=============\n");printf( "local_one ,addr:%p\n", &local_one);printf( "pb ,addr:%p\n", pb);printf("\n=============heap=============\n");printf( "pa ,addr:%p\n", pa);return 0;}
参考:
http://www.360doc.com/content/11/0330/21/1317564_105977930.shtml
http://hi.baidu.com/bitcore/blog/item/77c521c65f4512d7d10060eb.html
http://apps.hi.baidu.com/share/detail/22734757
http://my.oschina.net/alphajay/blog/3870
- C语言内存区域分配
- C语言内存区域分配
- C程序-内存区域分配
- C语言内存区域
- C语言内存分配
- C语言内存分配
- c语言内存分配
- C语言-内存分配
- C语言内存分配
- C语言内存分配
- c语言内存分配
- C语言内存分配
- C 语言内存分配
- C语言内存分配
- C语言内存分配
- c语言内存分配
- c语言内存分配
- C语言内存分配
- 【php】利用php函数实现文件上传案例分析
- 2.3. Cluster Plumbing Library
- 排序算法终结总结<Java实现>
- 重装ubuntu之后配置我滴系统环境
- 你知道1+1=2是如何在cpu中运作的么?----跟我到cpu内部去看看吧!(1)
- C语言内存区域分配
- 有趣的数字之n=a!+b!+c!(自定义函数)
- AMQP协议
- rev返回值
- CvMat的用法详解及实例
- Log4j示例
- 牛腩新闻发布系统
- 符合SCORM 1.2 标准平台的强制性 Datamodel (已知46个中的14个为强制性)
- java 异常处理机制