c基础存储结构
一个程序本质上都是由.text段、.data段、.bss段三个组成的.
text段和data段都在可执行文件中(嵌入式系统一般时固化在镜像文件中),由系统从可执行文件加载.
bss段不在可执行文件中,由系统初始化.
1.静态区
程序结束后由系统释放。
1.1代码段
代码段就是程序中的可执行部分,直观理解代码段就是函数堆叠组成的(就是函数体里面的程序那部分)
text段:存放二进制代码;
.rodata段:存放常量。
代码区的大小在程序运行前就已经确定,该内存区域一般是只读的.
1.2未初始化数据段
全局变量
数据段就是程序中的数据,全局变量才算是程序的数据,局部变量不算程序的数据(它在栈上),只能算是函数的数据。
data段: 存放已初始化的全局变量和静态变量;
.bss段:存放未初始化的全局变量和静态变量;
这一块的内存在程序编译时就已经分配好,在程序整个运行期间都存在。属于静态内存分配
2.动态区
2.1.堆
自由分配内存大小,malloc()动态开辟内存,使用后需要free();
用于存放在程序运行时被动态分配的内存段。堆的大小不固定,可以动态增加和减少。使用malloc()等函数动态分配内存到堆上,使用free()等函数释放对应的动态分配内存。堆的最大容量受限于系统中有效的虚拟内存。
2.2.栈
用于存放程序运行时临时创建的局部变量,除此以外,被调用函数地址和其参数也会被压入发起调用的进程栈中,调用结束后,函数的返回值也会存放到栈中。程序执行后由系统释放。
栈的特点
1.运行时自动分配和自动回收性:栈是自动管理的,程序员不需要手工干预。方便简单。 |
---|
2.反复使用性:栈内存在程序中其实就是那一块空间,程序反复使用这一块空间。 |
3.遗留性:栈内存由于反复使用,每次使用后程序不会去清理,因此在使用栈时还是上次栈中遗留下的数值。 |
4.临时性:函数不能返回栈变量的指针,因为这个空间是临时的. |
5.溢出性:因为操作系统事先给定了栈的大小,如果在函数中无穷尽的分配栈内存总能用完 |