Chinaunix首页 | 论坛 | 博客
  • 博客访问: 157482
  • 博文数量: 55
  • 博客积分: 2510
  • 博客等级: 少校
  • 技术积分: 582
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-17 19:31
文章分类

全部博文(55)

文章存档

2010年(19)

2009年(36)

我的朋友

分类: C/C++

2009-10-12 12:29:08

一个典型的C程序存储空间布局由以下几个部分组成:
 
(正文段):CPU执行的指令部分,也就是主要的程序代码编译出来的结果,只读,通常可以共享
 
(初始化数据段):通常称之为数据段,包含了程序中需要明确赋值的变量,譬如一些初始化的全局变量等, 
             如 int a = 10,变量名和值都存放在这个段中。全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 
 
(未初始化数据段):通常称之为BSS(Block Started by Symbol)段,由符号开始的块,包含了程序中没有进行赋值的变量,譬如一些未初始化的全局变量,如 int a,在程序执行之前,内核会把这部分全部置为0(NULL)
 
(栈):stack 自动变量以及每次函数调用时所需保存的信息放在此段中。如函数调用时要保存返回地址等。栈是从上向下分配的。 由编译器自动分配释放,存放函数的参数值,局部变量的值等。

(堆):heap 通常在堆中进行动态存储分配,如malloc, calloc, realloc等都从这里面分配。堆是从下向上分配的。一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵
 
通常堆顶和栈底之间的虚拟地址空间是很大的。

对X86处理器上的Linux,正文段从0x08048000开始,栈底则从0xC0000000之下开始。
 下图是一个典型的C程序存储空间的逻辑布局:
 
//main.cpp
int a = 0; 全局初始化区data
char *p1; 全局未初始化区 bss
main()
{
int b; 栈 stack
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}

本篇文章来源于 开发学院   原文链接:
阅读(545) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~