Chinaunix首页 | 论坛 | 博客
  • 博客访问: 128921
  • 博文数量: 38
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 191
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-16 11:31
个人简介

嵌入式新人

文章分类

全部博文(38)

文章存档

2016年(38)

我的朋友

分类: 嵌入式

2016-08-05 17:22:21

C语言程序经过编译、链接后形成的二进制映像文件由堆,栈,代码段和数据段组成,在内存中的分布见图。

1 heap

堆是进程运行中动态分配的内存段(空间可以不连续),它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)。

堆的物理内存空间是由程序申请的,并由程序负责释放。

2 stack

栈是存放局部变量的连续内存空间段(不包括static变量)。此外,由于栈具有先进后出的特点,适用于函数调用时的保存/恢复现场。。

栈的物理内存空间是由操作系统分配的,申请与释放都由操作系统管理。

3

         包括代码段和数据段,数据段又分为只读数据段,已经初始化读写数据段和未初始化数据段(即BSS段)。

3.1代码段

代码段存放的是可执行文件的操作指令,需要防止运行时被非法修改,所以代码段是只读的。

3.2 数据段

3.2.1只读数据段

只读数据段一般存放常量和const修饰的变量。

3.2.2已初始化数据段

已初始化数据段存放已初始化(非零)的全局变量,和已初始化的静态局部变量(static修饰的已经初始化的变量)

3.2.3未初始化数据段(BSS

未初始化数据段存放未初始化和初始化为零的全局变量,和未初始化和初始化为零的静态局部变量(static修饰的未初始化的变量),这些变量在程序运行前不需要占用存储器的空间。

4  C语言示例


点击(此处)折叠或打开

  1. #include
  2. int a = 0; //全局变量,初始化为零,bss段
  3. char *p1; //全局变量,未初始化,bss段
  4. void main ( void )
  5. {
  6. static int c =0; //静态局部变量,初始化为零,bss段
  7. int b; //局部变量,栈
  8. char s[] = "abc"; //局部变量,栈
  9. char *p2; //局部变量,栈
  10. char *p3 = "123456"; // "123456\0" 常量,只读数据段;p3局部变量,栈。
  11. p1 = (char *)malloc(10); // 堆。
  12. p2 = (char *)malloc(20); // 堆。
  13. }



阅读(1307) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~