C程序的存储空间布局

C程序在内存中由以下几部分组成:

  • 正文段:这是由CPU执行的机器指令部分,通常情况下,正文段是可以共享的,子进程和父进程会共同维护内存中的一个副本;另外,正文段一般也是只读的,以防止程序由于意外而修改其本身;同时其中包含了只读的常量,比如字符串常量等。
  • 初始化数据段,即数据段:它包含了程序中已初始化的全局变量,属于静态分配内存;
  • 非初始化数据段,即bss段:这个名称来源于早期汇编程序的一个操作符,意思是“block started by symbol(由符号开始的块)”,属于静态内存分配。在程序开始执行之前,内核将此段初始化为0;
  • 栈:自动变量以及每次函数调用时所需保存的信息都存放在此段中。借此,有了C语言的递归调用。
  • 堆:堆中进行的是动态内存分配。例如使用malloc函数;

下图显示了这些段的一种典型安排方式

可见,磁盘程序文件中只有正文段和初始化数据段,未初始化数据段不会在磁盘程序文件中出现。

size命令可以查看可执行程序的正文段、数据段和bss段的长度(单位:字节),其中4列和5列分别是以十进制和十六进制表示的总长度。

 

posted @ 2014-02-19 01:02  thinker-lj  Views(236)  Comments(0Edit  收藏  举报