Linux下c内存映像

存储类、生命周期、作用域、链接域

大方向分为

应用空间 + 内核空间

他俩内存空间布局差不多。这里重点回顾分析应用空间布局,应用空间分为:代码段 + 数据段(静态数据段+动态数据段)

代码段

为啥是只读的

代码段在编译时就定好了,在程序的运行过程中,不能在代码段去开辟空间,以及释放空间。

包含哪几部分

ELF头、段头部表、init节

参考:剖析可执行文件ELF组成

.text

指令节,也叫代码节,所有函数中的指令都放在了.text节中。能够与指令直接弄在一起的常量,也随指令一起放在了.text中。

.rodata

常量节,无法直接和指令放在一起的常量,就放在.rodata中。

数据段

静态数据段

为啥是只读的(为啥是静态的)

代码段在编译时就定好了,在程序的运行过程中,不能在代码段去开辟空间,以及释放空间。也不能随意释放已有变量的空间,像这种在编译阶段完成了变量空间安排的情况,就是静态的。

包含哪几部分

.bss

未初始化的静态变量的空间,都开辟于.bss中。

.data

初始化了的静态变量的空间,都开辟于.data。

动态数据段

为什么称为动态的?

变量空间的开辟和释放不是在编译阶段决定的,而是在程序的运行过程中完成的,这就是动态的含义。

包含哪几部分

堆(手动区)

程序在运行的过程中,通过调用malloc函数来开辟空间,以及调用free来释放空间。之所以叫手动的,是因为我们在编写程序时,必须亲自动写调用malloc和free函数的代码。

栈(自动区)

函数运行时自动从栈中开辟空间,函数运行结束时又会自动释放开辟的空间,开辟和释放的过程,完全是自动完成的。从栈里面开辟空间就是压栈,释放空间其实就是弹栈。

存储类

什么是存储类

存储类的全称叫“存储类型”,存储类就是用来说明“常量、变量和函数”的存储位置的,比如自动局部变量在栈中,存储位置为栈,那么它的存储类就是栈。

细说存储类

函数指令

存储类为.text,因为函数指令都是存放在.text中的。函数指令的存储类是固定的,所以函数指令的存储位置是固定不变的。

常量

常量的存储类也是固定的,要么是.text,要么是.rodata。

①当常量比较小时,小到能够和指令放在一起的话,就会和指令一起直接放在.text中。此时常量的存储类为.text。

②常量比较大时,大到无法直接成为指令放在一部分,此时就需要单独的存在.rodata中,此时常量的存储类就为.rodata

全局变量

①初始化了的全局变量,存储类为.data。

②未初始化的全局变量,存储类为.bss

全局变量的存储类也是固定的,要么在.data中要么在.bss。.data、.bss合称为静态数据段,或者静态数据区,所以全局变量的存储类可统称为“静态数据段”。

局部变量

局部变量的存储类不是固定,根据修饰的auto、static、register关键字的不同,存储类不同。

(1)自动局部变量 与 auto关键字

fun()
{
    auto int a; //等价于int a,auto可以省略不写
}
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-08-02
  • 2021-07-25
  • 2021-09-09
  • 2021-07-27
  • 2021-11-05
  • 2021-09-30
猜你喜欢
  • 2022-02-19
  • 2021-05-28
  • 2021-11-25
  • 2021-05-19
  • 2022-12-23
  • 2021-08-15
相关资源
相似解决方案