变量的生命周期
生命周期指的是程序在运行过程中,变量在内存中的从创建到销毁的生存期。
C语言的变量类型分为以下几类:
1、全局变量
2、静态全局变量 (类型说明符static)
3、静态局部变量 (类型说明符static)
4、局部变量(类型说明符 auto 可以省略)
5、寄存器变量
按生存时间分:
可以把变量的生命周期分为程序运行期间存在和函数运行期间存在。
程序运行期间存在的有:局部变量,局部寄存器变量。
函数运行期间存在的有:全局变量,全局静态变量,局部静态变量,malloc申请的堆内存。
按存储位置分:
静态存储区,存放全局变量和静态变量,在执行程序前分配存储空间,占据固定的存储单元。
动态存储区,存放的是函数里的局部变量、函数的返回值、形参等,它在函数被执行的过程中进行动态分配,在执行完该函数时自动释放。由于这种分配和释放都是每次执行到函数时进行的,因此前后两次调用同一个函数,其临时变量分配到的地址可能是不同的。
注意事项
1、局部变量不能通过指针返回。原因是局部变量在函数执行结束已经被销毁,指针返回的地址已经被回收。
2、静态局部变量保存的值不会随着函数执行结束而回收。
3、malloc申请的堆内存需要回收,不然会随着程序一直驻留在内存。
4、作用域和生命周期不是一回事,局部变量可以在函数内部访问。
5、动态存储区的变量是**随着函数的执行过程**创建销毁的。
作用域示例
int main()
{
int *p = NULL;
fileManger::FileInfo * fileInfop = NULL;
if (1)
{
fileManger::FileInfo fileInfo;
fileInfo.buffer = "aaaadfsdfaaaaaa";
int a =200000;
p = &a;
fileInfop = &fileInfo;
}
int c =3;
int d =4;
// 输出是200000fileInfoaaaadfsdfaaaaaa 说明局部变量的生命周期是这个函数内不是块作用域内 但是对于一个类在离开这个作用域会执行析构函数
cout << "输出是" << *p << "fileInfo" << fileInfop->buffer << endl;
}