Linux 应用程序的内存分配中,是用 segment(段)进行区别的,使用 size 命令进行查看:
  size a.out
  text       data        bss        dec        hex    filename
  1639        264          8       1911        777    a.out
  可见,数据是分配 text 段,data 段,bss 段,这里使用size 命令的查看只能是看到这三个段的大小(编译的阶段可以确定下来)而,堆、栈则是在运行的时候动态去分配空间的。
  一、Linux 段的分配
  text:代码段,存储代码、常量、字符串等只读的数据
  data: 数据段,保存的是有经过初始化的全局变量和静态变量的部分。这里的初始化,初始化的值必须不能为零
  bss: bss 段,保存的是没有经过初始化的全局变量、静态变量和初始化的值为零的全局变量和静态变量。
  堆(heap): 用于动态内存的分配额哦,程序猿手动调用 malloc 进行分配和释放。
  栈(stack):存放局部变量和函数的参数等。
  二、内存分配
  Linux 下可执行文件是安装段的方式进行管理的,一个可执行的文件是按照如下的方式进行映射:

  2.1、a.out 文件的介绍
  一个可执行的文件,window 平台是通过 .exe 或者 .txt 等后缀的方式进行区分的,但是Linux 下的可执行文件则是通过一些特定的、神气的数字进行表示的。
  一个可执行的文件是通过一些数字地表示是可执行的文件,通过这样的方法达到标签的目的,这些数字我们称之为神气的数字,而这些数组是通过能够被确认下来的,一组随机的二进制位的集合。
  2.2、映射
  一个可执行的文件,按照可执行文件的段,进行映射到内存中的。
  段,实质上是一段连续的虚拟内存地址空间。这里需要注意的是,在低的地址的位置存在一部分未被映射的区域,虽然它是在进程的地址空间内,但是并未被赋予物理地址,所以对这块区域的引用都是违法的。在典型的情况下,它是从零地址开始的几 K 字节,它用于捕捉使用空指针和小整型的指针应用内存的情况(摘自C专家编程)。
  三、大小的比对
  计算 size a.out 的大小
  原始的大小;
  int main()
  {
  printf("hellow world ");
  }
  text       data        bss        dec        hex    filename
  1132        256          8       1396        574    a.out
  1、局部变量是存储在栈中:
  int main()
  {
  int a;
  printf("hellow world ");
  }
  ~
  text       data        bss        dec        hex    filename
  1132        256          8       1396        574    a.out