C程序的存储空间和布局

 

知道程序语言的构成,才可以去解析语言(编译器的工作);

 

 

C程序(C语言编写的程序)的组成:

  • 正文段(文本段)

     cpu执行的机器指令部分;

 

     通常,正文段可共享---频繁执行的程序在存储器中也只需要一个副本

     通常,正文段是只读的---防止程序意外修改其指令

 

  • 初始化数据段(数据段)

       包含程序中需明确赋初值的变量;

 

  • 未初始化的数据段(bss段,block started by symbol---由符号开始的块

      程序开始执行前,内核将此段中的数据初始化为0或空指针

 

  • 栈(stack)

     自动变量(过程结束自动释放的变量,一个函数就是一个过程)以及每次函数调用时所需保存的信息都存放在此段中;

     每次函数调用时,其返回地址以及调用者的环境信息(某些机器寄存器的值)都保存在栈中;

     最近被调用的函数在栈上为其自动和临时变量分配存储空间(栈动态分配---编译器的工作);

 

  • 堆(heap)

        通常,在堆中进行动态存储分配;

       堆位于未初始化数据段与栈之间(历史形成的惯例);

 

 

C程序典型存储空间的安排

 

 

动态存储方式

在程序运行期间根据需要进行动态分配存储空间的方式;

动态存储变量是在程序执行过程中,使用它时才分配存储单元,使用完立即释放;

 

静态存储方式

在程序编译时分配固定的存储空间的方式;

变量(全局变量、静态变量)定义时就分顶存储单元并一直保持不变,知道程序运行结束;

 

动态内存分配(堆):发生自强程序调入和执行时,动态地分配或者回收存储空间的分配内存的方法;

 

静态内存分配:发生在程序编译和链接的时,预先分配存储空间(栈可以是静态分配如全局变量,也可以是动态分配;,栈动态分配是由编译器进行释放);

 

参考书籍:Unix环境高级编程