变量的生命周期
1、栈变量的生命周期
(1)栈变量是指在函数内部声明的局部变量,其内存分配在栈上。
(2)局部变量(栈变量)存储在栈上,生命周期是临时的。临时的意思就是说:代码执行过程中按照需要去创建、使用、消亡的。譬如一个函数内定义的局部变量,在这个函数每一次被调用时都会创建一次,然后使用,最后在函数返回的时候消亡。
2、堆变量的生命周期
(1)堆内存空间是客观存在的,是由操作系统维护的。我们程序只是去申请然后使用然后释放。
(2)堆变量的生命周期就是:从malloc申请时诞生,然后使用,直到free时消亡。所以堆内存在malloc之前和free之后不能再去访问,因此堆内存在实践编程时都是被反复的malloc和free的。
3、data段和bss 段变量的声明周期
(1)已初始化的数据段(.data段):存放初始化为非0的全局变量和静态变量;未初始化的数据段(.bss 段):存放未初始化和初始化为0 的 全局变量和静态变量。
(2)全局变量和静态变量的生命周期是永久的。永久的意思就是在程序被执行时诞生,在程序终止时消亡。所占用的内存是不能被程序自己释放的,所以程序如果申请了过多的全局变量会导致这个程序一直占用大量内存。
4、代码段和只读数据段(.rodata 段)
(1)代码段存放程序的可执行指令。
(2)字符串常量和const修饰的变量,存储在代码段 或 只读数据段,取决于平台。
- Cortex-M:由链接脚本决定,默认放在
.rodata
段,物理上在 Flash 区。
(3)代码段和只读数据段,它们的生命周期是永久的。