C语言为内存分配空间(代码段、数据段、bss段、存储类、变量的生命周期)

1.linux下C程序为内存分配空间

(1)代码段

对应着程序中的代码(函数),代码段在linux中又叫文本段(.text)

 (2)数据段、bss段

数据段存:显式初始化为非0的全局变量,显式初始化为非0的static局部变量

bss段存:显式初始化为0或者未显式初始化的全局变量,显式初始化为0或未显式初始化的static局部变量。

 (3)

C语言中什么样变量存在堆内存中?C语言不会自动向堆中存放东西,堆的操作是程序员自己手工操作的。程序员根据需求自己判断要不要使用堆内存,用的时候自己申请,自己使用,完了自己释放。

(4)文件映射区

文件映射区就是进程打开了文件后,将这个文件的内容从硬盘读到进程的文件映射区,以后就直接在内存中操作这个文件,读写完了后在保存时再将内存中的文件写到硬盘中去

(4)

栈内存区,局部变量分配在栈上;函数调用传参过程也会用到栈,递归函数运行也在栈上

(5)内核映射区

内核映射区就是将操作系统内核程序映射到这个区域了。
对于linux中的每一个进程来说,它都以为整个系统中只有它自己和内核而已。它认为内存地址0xC0000000以下都是它自己的活动空间,0xC0000000以上是OS内核的活动空间。
每一个进程都活在自己独立的进程空间中,0-3G的空间每一个进程是不同的(因为用了虚拟地址技术),但是内核是唯一的。
 


2.代码段、数据段、bss段

(1)编译器在编译程序的时候,将程序中的所有的元素分成了一些组成部分,各部分构成一个段,所以说段是可执行程序的组成部分。
(2)代码段:代码段就是程序中的可执行部分,直观理解代码段就是函数堆叠组成的
(3)数据段(.data段也被称为数据区、静态数据区、静态区):数据段就是程序中的数据,直观理解就是C语言程序中的全局变量。(注意:全局变量才算是程序的数据,局部变量不算程序的数据,只能算是函数的数据)
(4)bss段(又叫ZI(zero initial)段):bss段的特点就是被初始化为0,bss段本质上也是属于数据段,bss段就是被初始化为0的数据段

注意区分:数据段(.data)和bss段的区别和联系

  • 二者本来没有本质区别,都是用来存放C程序中的全局变量的。
  • 区别在于把显示初始化为非零的全局变量存在.data段中,而把显式初始化为0或者并未显式初始化(C语言规定未显式初始化的全局变量值默认为0)的全局变量存在bss段

有些特殊数据会被放到代码段

  • C语言中使用char *p = “linux”;定义字符串时,字符串"linux"实际被分配在代码段,也就是说这个"linux"字符串实际上是一个常量字符串而不是变量字符串。


const的实现方法至少有2种:

第一种就是编译将const修饰的变量放在代码段去以实现不能修改(普遍见于各种单片机的编译器);
第二种就是由编译器来检查以确保const型的常量不会被修改,实际上const型的常量还是和普通变量一样放在数据段的(gcc中就是这样实现的)。


3.变量的生命周期

(1)栈变量的生命周期

局部变量(栈变量)存储在栈上,生命周期是临时的。临时的意思就是说:代码执行过程中按照需要去创建、使用、消亡的

譬如一个函数内定义的局部变量,在这个函数每一次被调用时都会创建一次,然后使用,最后在函数返回的时候消亡

(2)堆变量的生命周期

程序使用堆内存的这一段时间,因此堆变量也有了自己的生命周期,就是:从malloc申请时诞生,然后使用,直到free时消亡。

(3)数据段、bss段变量的生命周期

全局变量的生命周期是在程序被执行时诞生,在程序终止时消亡。

全局变量所占用的内存是不能被程序自己释放的,所以程序如果申请了过多的全局变量会导致这个程序一直占用大量内存。

(4)代码段、只读段的生命周期

其实就是程序执行的代码,其实就是函数,它的生命周期是永久的。

有时候放在代码段的不只是代码,还有const类型的常量,还有字符串常量。(const类型的常量、字符串常量有时候放在rodata段,有时候放在代码段,取决于平台)



 

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式_笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值