C语言内存布局理解

本文介绍了C语言内存的五个区域:栈区、堆区、全局/静态区、字符常量区和程序代码区,详细阐述了各区域的作用、分配与释放机制,并探讨了程序加载时静态和动态内存的区别。
摘要由CSDN通过智能技术生成

编辑:就是创建和修改C程序的源代码-我们编写的程序称为源代码。
编译:就是将源代码转换为机器语言。编译器的输出结果成为目标代码,存放它们的文件称为目标文件。扩展名为.o或者.obj。
(该部分编译是指汇编器编译汇编语言或者编译器编译高级语言)
链接:链接器将源代码由编译器产生的各种模块组合起来,再从C语言提供的程序库中添加必要的代码模块,将它们组成一个可执行的文件。在windows下扩展名为.exe,Unix下无扩展名。
执行:运行程序。

1.栈区(stack) --编译器自动分配释放,主要存放函数的参数值,局部变量值等;

2.堆区(heap) --由程序员分配释放;

3.全局区或静态区 --存放全局变量和静态变量;程序结束时由系统释放,分为全局初始化区和全局未初始化区;

4.字符常量区 --常量字符串放与此,程序结束时由系统释放;

5.程序代码区--存放函数体的二进制代码

文本段(Text)
        通常代码段和只读数据段合成为文本段(Text),包含实际要执行的代码(机器指令)和常量。它通常是共享的,多个实例之间共享文本段,文本段是不可修改的。

代码段(Code)
        代码段由程序中执行的机器代码组成。在C语言中,程序语句进行编译后,形成机器代码。在执行程序的过程中,CPU的程序计数器指向代码段的每一条机器代码,并由处理器依次运行。

只读数据段(RO data,即常量区)
        只读数据段是程序使用的一些不会被更改的数据,使用这些数据的方式类似查表式的操作,由于这些变量不需要更改,因此只需要放置在只读存储器中即可。

       通常字符串常量就是放置在这里,程序结束后由系统释放。

        注意:这个区域的存在与否,一直是一个争议的地方,但是我们这里认同是存在的,因为我们的程序中的确出现了与其他数据段不同的一块区域,但是往往很多时候大家把只读数据段(RO data)和下面的已初始化读写数据段(RW data)合称为数据段data,但是其实这个是不合适的,因为在执行过程中,这两个区域的读写权限是不同的,顾名思义,只读数据段(RO data)是只读的,而已初始化读写数据段是可读可写的。

  

已初始化读写数据段(RW data)
        已初始化数据是在程序中声明,并且具有初值的变量,这些变量需要占用存储器的空间,在程序执行时它们需要位于可读写的内存区域内,并具有初值,以供程序运行时读写。

未初始化数据段(BSS  Block Started by Symbol)
        未初始化数据是在程序中声明,但是没有初始化或者初始化为0的变量,这些变量在程序运行之前不需要占用存储器的空间,BSS段的变量只有名称和大小却没有值,运行后会被初始化为0。

动&静

        一个程序被加载到内存中,这块内存首先就存在两种属性:静态分配内存和动态分配内存。 
静态分配内存:是在程序编译和链接时就确定好的内存。 
动态分配内存:是在程序加载、调入、执行的时候分配/回收的内存。

        代码段、只读数据段、读写数据段、未初始化数据段属于静态区域,堆、栈属于动态区域。代码段、只读数据段和初始化读写数据段在程序链接后即产生ÿ

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值