`
java鸵鸟
  • 浏览: 2355 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

C语言内存布局

c 
阅读更多
C语言从源程序文件(.c)到二进制程序文件(.exe或者.dll),需要经过三个阶段,编译->汇编->链接。编译阶段,将源程序文件编译成汇编代码。在由汇编程序,执行汇编代码,对应每个源程序文件生成一个目标文件(.obj)。最后通过链接将各个目标文件链接生成最后的可执行文件。在C语言中有六种数据段,可以分为两类:一类是静态生成的,类是动态生成的。不同的数据段,会在不同的阶段生成。下面首先介绍下这六种数据段的概念。
代码段(Code)
由各个源程序的函数对应的机器代码组成,比如顺序代码(加、减、与等运算符),选择代码(if、if…else等选择运算符),循环代码(while等)。由源程序生成的目标文件中保存了函数对应的代码段。

只读数据段(RO Data)
在程序中定义的不可改变的常量数据(const关键字修饰)。比如全局常量、局部常量、在程序中使用的常量。这部分数据段也保存在编译后生成的目标文件中。

读写数据段(RW Data)
在程序中定义的可读可写的并且已经初始化的数据。例如已初始化的全局变量、局部静态变量。这部分数据保存在编译后生成的目标文件中。

未初始化数据段(BSS)
和读写段类似,属于静态数据。和读写数据段的区别是它没有经过初始化。因为没有经过初始化,所在不占用目标文件的大小,只是在目标文件中标示该数据段的大小。只在程序初始化时产生。

堆区
由malloc、calloc、realloc等分配内存的函数分配的堆内存。它在程序执行时,动态生成的内存。这部分内存很自由,由程序控制生成和释放。同时也很危险,很容易造成内存泄露,内存不足等错误。

栈区
和堆区一样会在程序执行时动态生成。与堆不同的是,栈的生成和释放都是系统自动进行。所以相对来说很安全并且效率很高。栈中保存了函数的参数,函数中定义的变量(静态变量除外),以及函数返回值。每个函数对应一个栈帧,栈帧按照先进后出的顺序来释放空间。

在理解上面六种数据段后,我们在看各个数据段都在C语言哪些阶段产生。程序在通过编译汇编后,由C源程序文件生成对应的目标文件,目标文件中保存了每个函数的代码段,以及源程序文件中定义的只读数据段和读写数据段。未初始化数据段、堆和栈不会再这个阶段产生。在链接时,Link命令将所有的目标文件中的代码段、只读数据段和读写数据段进行抽出和重组。重新组合而成一个新的二进制文件。这个二进制文件就是可执行文件,它也是由程序段、只读数据段和读写数据段组合而成。未初始化数据段、堆和栈在这个阶段也还没有产生。当可执行文件进行初始化时,会产生未初始化数据段。在执行阶段产生堆和栈内存。这个就是C语言从编译到执行时内存的分配过程。
分享到:
评论

相关推荐

    C语言内存精讲,让你彻底明白C语言的运行机制!

    4. C语言内存对齐,提高寻址效率 5. 内存分页机制,完成虚拟地址的映射 6. 分页机制究竟是如何实现的? 7. MMU部件以及对内存权限的控制 8. Linux下C语言程序的内存布局(内存模型) 9. Windows下C语言程序的内存...

    浅析C语言中的内存布局

    在深入理解C语言内存布局时,还需要了解编译原理和操作系统层面的知识,比如如何从源代码生成a.out,以及如何将a.out映射到内存空间。这涉及到链接器的工作、段对齐的概念以及进程的内存模型等复杂主题。 总之,...

    收集一些C语言内存相关的项目.zip

    6. **结构体与内存布局**:结构体中的成员可能会因为内存对齐规则而产生间隙,这在处理大量结构体数据时可能影响性能。了解如何设计结构体以减少内存浪费是很重要的。 7. **内存安全**:防止越界访问和野指针是...

    C语言内存操作的21份资料

    8. **结构体与内存**:结构体包含多个成员,每个成员都有自己的内存对齐规则,理解结构体的内存布局对于优化程序性能至关重要。 9. **内存碎片**:频繁的动态内存分配和释放可能导致内存碎片,影响内存利用率。有效...

    C语言内存讲解

    这对多维数组和结构体的内存布局有直接影响。 4. **内存泄露** 如果程序员分配了堆内存但忘记释放,就会导致内存泄露。长期的内存泄露将消耗大量系统资源,最终可能导致系统性能下降甚至崩溃。 5. **野指针** ...

    C语言内存对齐.pdf

    C语言内存对齐 C语言结构体对齐是指在C语言中,结构体成员在内存中的存储方式,以满足不同的数据类型对齐要求。结构体对齐是C语言中一个重要的概念,对于C语言程序员来说非常重要。 数据成员对齐规则 在C语言中,...

    微软C语言PPT全集

    14. **内存模型和优化**:探讨C语言内存布局,包括栈、堆和静态存储区。 15. **并发与多线程**:介绍如何在C语言中实现线程和进程,以及同步和互斥机制。 16. **编译器与链接器**:解释编译过程和链接器的工作原理...

    C语言程序的内存布局[参考].pdf

    C语言程序的内存布局是理解程序执行过程的关键。在C语言中,程序的内存主要划分为以下几个区域: 1. **代码段(Code or Text)**:这是程序的机器码所在的地方,由编译器将源代码编译成的指令构成。在程序运行时,...

    C语言实现运行与UNIX平台的内存数据库

    在这个项目中,C语言被选为实现内存数据库的主要工具,因为它的低级特性使得可以直接操作内存,从而更有效地管理数据库的内存布局和数据结构。 Unix平台提供了丰富的多进程并发控制机制,如信号量、互斥锁和条件...

    固定块内存池c语言实现

    理解并实现固定块内存池需要深入理解C语言内存管理机制,包括指针操作、内存分配函数的工作原理以及数据结构的设计。通过分析和实践这些文件,开发者可以学习到如何创建和维护一个高效、可靠的内存池系统,这对于...

    BIOS内存布局图

    BIOS(Basic Input/Output System)是计算机启动时加载的第一个软件,它负责初始化硬件设备和提供与硬件交互的基础服务。...阅读这份PDF文档,将有助于你深化对BIOS内存布局和C语言内存管理的理解。

    C_Program_Skill.rar_C语言 内存池_linux 线程池

    而“treeTest.c”可能涵盖了数据结构——树的实现,这对于理解和优化内存布局以及多线程环境下数据的共享和访问控制十分有用。 “len_int.c”可能展示了计算整数长度的技巧,这对于处理大数据或内存分配的计算很有...

    C语言编译,链接,内存布局,动静链接库的使用

    C语言编译,链接,内存布局,动静链接库的使用

    C语言编程程序的内存如何布局

    "C语言编程程序的内存布局" C语言编程程序的内存布局是指C语言程序在计算机内存中的组织和分配方式。了解C语言程序的内存布局对于编写高效、稳定和安全的程序非常重要。 在C语言程序中,内存布局可以分为静态区域...

    C语言程序内存布局

    C语言通过栈来维护函数调用上下文,也就是说C中的函数、函数参数列表、局部变量、函数返回值都保存在栈内存中,在完成函数调用之后栈帧随即销毁,至于具体的压栈顺序和上下文维护工作由谁来完成,则取决于函数的调用...

    内存布局图

    C语言九阳神功----内存布局图!学习C语言最重要的莫过于了解内存分布,只有研究到底层去,才能更好的学习C!

    C语言的内存分配.pdf

    2. **运行时内存布局**: - **堆区(heap)**:程序员通过动态内存分配函数(如`malloc`、`calloc`、`realloc`和`free`)来管理的内存区域,用于在程序运行时按需分配和释放内存。 - **栈区(stack)**:编译器...

    Linux 嵌入式c语言开发内存管理介绍

    首先,理解进程的内存布局至关重要。程序是静态的二进制文件,存储在磁盘上,而进程是程序在内存中的动态表示,具有独立的资源,包括内存。在Linux系统中,每个进程都有自己的虚拟内存空间,这使得每个进程都认为...

Global site tag (gtag.js) - Google Analytics