分类: 嵌入式
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语言示例
点击(此处)折叠或打开