C程序的存储空间和布局
知道程序语言的构成,才可以去解析语言(编译器的工作);
C程序(C语言编写的程序)的组成:
-
正文段(文本段)
cpu执行的机器指令部分;
通常,正文段可共享---频繁执行的程序在存储器中也只需要一个副本;
通常,正文段是只读的---防止程序意外修改其指令;
-
初始化数据段(数据段)
包含程序中需明确赋初值的变量;
-
未初始化的数据段(bss段,block started by symbol---由符号开始的块)
程序开始执行前,内核将此段中的数据初始化为0或空指针;
-
栈(stack)
自动变量(过程结束自动释放的变量,一个函数就是一个过程)以及每次函数调用时所需保存的信息都存放在此段中;
每次函数调用时,其返回地址以及调用者的环境信息(某些机器寄存器的值)都保存在栈中;
最近被调用的函数在栈上为其自动和临时变量分配存储空间(栈动态分配---编译器的工作);
-
堆(heap)
通常,在堆中进行动态存储分配;
堆位于未初始化数据段与栈之间(历史形成的惯例);
动态存储方式:
在程序运行期间根据需要进行动态分配存储空间的方式;
动态存储变量是在程序执行过程中,使用它时才分配存储单元,使用完立即释放;
静态存储方式:
在程序编译时分配固定的存储空间的方式;
变量(全局变量、静态变量)定义时就分顶存储单元并一直保持不变,知道程序运行结束;
动态内存分配(堆):发生自强程序调入和执行时,动态地分配或者回收存储空间的分配内存的方法;
静态内存分配:发生在程序编译和链接的时,预先分配存储空间(栈可以是静态分配如全局变量,也可以是动态分配;,栈动态分配是由编译器进行释放);
参考书籍:Unix环境高级编程