C语言程序经过编译链接后形成二进制映像文件的组成

C语言程序经过编译链接后形成二进制映像文件由栈,堆,数据段,代码段组成,其中数据段又分为:只读数据段,已经初始化读写数据段,未初始化数据段(BSS段)。如下图所示:

1.栈区(stack):由编译器自动分配释放,存放函数的参数值局部变量等值。其操作方式类似于数据结构中的栈。

2.堆区(heap):一般由程序员释放,若程序员不释放,则可能会引起内存泄露。

    注:1)堆和数据结构中的堆栈不一样,其类是链表。

        2)所谓的内存泄露是指程序在不断运行中内存越来越少,如果程序结束了,那么操作系统会自动将其占用的内存释放掉。

3.程序代码区:存放函数体的二进制代码,这一部分只可读,不可写。

4.数据段:

    1)只读数据段:只读数据段是程序使用的一些不会被更改的数据,存放到只读存储器(和代码区一起)。一般是const修饰的变量和程序中使用的一些文字常量

    2)已初始化的读写数据段:在程序中声明,并且具有初值的变量,在程序运行中位于可读写的内存区域,一般为初始化过的全局变量初始化过的static局部变量

    3)未初始化段(BSS):未初始化的数据是在程序中声明,但是没有被初始化的变量,属于静态存储区。未初始化数据段只有在运行的初始化阶段才会产生,因此它的大小不会影响目标文件的大小。在程序中一般是没有初始化的全局变量没有初始化的静态局部变量





原文地址:https://www.cnblogs.com/dchipnau/p/5255266.html