本文主要介绍一下C应用程序内存结构,如下图 :
C应用程序内存空间主要分为代码段和数据段:
1. 代码段(只读段)
代码段在编译时就已经确定好了,在程序运行过程中,不能在代码段开辟和释放内存空间,代码段包括以下内容:
- ELF 头:也称作ELF个格式头,用来存放ELF格式所需要的一些基本信息
- 段头部表
- init 节
- .text:称作指令节,也叫代码节,所有函数中的指令都放在了 .text 节中,包括与指令直接弄在一起的常量,也随指令一起放在了 .text 节中
- .rodata:称作常量节,无法直接和指令放在一起的常量,就放在 .rodata 中
比如:char *p = “hello world”;
2. 数据段(可读/可写段)
数据段分为静态数据段和动态数据段两种
静态数据段,在编译阶段完成了变量空间安排的情况,就是静态的。
- .bss:未初始化的静态变量的空间,都开辟于 .bss 中
- .data:初始化的静态变量的空间,都开辟于 .data 中
动态数据段(栈和堆),该空间的开辟和释放不是在编译阶段决定的,而是在程序的运行过程中完成的,即所谓动态内存空间。
- 栈(自动区):函数运行时,会自动的开辟和释放该空间,即所谓的压栈和弹栈。
- 堆(手动区):程序在运行过程中,该内存空间由程序员使用 malloc 函数开辟和 free 函数释放。