c 多文件全局变量_必须知道的C语言知识细节:C程序编译后内存到底是如何布局...

f78c012322e21ebbd4d8df90516aa21c.gif

「今天是学习C语言第 116 天」

当你选择了一种语言,意味着你还选择了一组技术、一个社区。——Joshua Bloch

C语言程序编译以后,代码和数据都必须存放在内存中由CPU执行。理解C程序内存是如何划分布局,才能真正理解C语言中变量、存储类型、指针等底层知识点。

一个C语言程序编译后,可执行文件中运行时内存空间按照以下规律进行连续划分布局。以下各区域内存地址按照从小地址到大地址空间排列。

1.文本段

也称为代码区,存放C程序编译的二进制指令代码,例如定义的各种函数体内的代码翻译成CPU指令后存放在该区域。

2.数据段

存放经过初始化的全局变量和静态变量的值。C语言中初始化的全局变量和静态变量内存分配在这个区段,初值也保存在这里。

3.BSS段

Block Started by Symbol的缩写,中文译为符号开始的块,该区域保存未初始化的全局变量和静态变量,BSS段在可执行文件中将直接记录内存大小,当调入程序执行时,动态分配为BSS段分配指定大小的内存,使用完毕后释放。

备注:数据段和BSS段统称为数据区,BSS段主要是用来减少可执行文件本身的大小。

4.堆区

英文heap,C程序中动态内存申请和分配的区域,例如C语言程序中使用malloc,realloc,calloc和free函数进行手动内存申请和分配时,就分配在该区,如果申请后,未及时释放,该区域内存将一直占用,直到程序结束为止。这里的heap堆和数据结构中的堆完全不是一个概念。

5.栈区

英文stack,该区域内存是由编译器自动管理分配和释放的,局部变量、函数参数、函数调用等都是存放在该区域,内存操作方式和数据结构的栈类似,后进先出。当函数调用时分配栈内存空间,当函数调用返回时栈内存空间释放。

当然除此之外,C程序中还隐藏一部分低地址内存空间,该内存空间无法在C程序中进行访问,用于观察空指针、非法内存访问等情况,当程序访问该内存空间时,程序会出现非法内存访问等错误。

---------- End ----------

往期精彩推荐:

必须知道的C语言知识细节:声明和定义

C语言入门基础必学(2020.4版)

f9f59dafe7a4b159f228384c96940aff.png

「喜欢C请赏个 赞32d374c48ad853831da82b6645072e19.png    点击右下角 在看」

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值