C语言学习(二)生命周期

656 阅读2分钟

变量的生命周期

生命周期指的是程序在运行过程中,变量在内存中的从创建到销毁的生存期。

C语言的变量类型分为以下几类:

1、全局变量

2、静态全局变量 (类型说明符static3、静态局部变量 (类型说明符static4、局部变量(类型说明符 auto 可以省略)

5、寄存器变量

按生存时间分:

可以把变量的生命周期分为程序运行期间存在和函数运行期间存在。

程序运行期间存在的有:局部变量,局部寄存器变量。

函数运行期间存在的有:全局变量,全局静态变量,局部静态变量,malloc申请的堆内存。

按存储位置分:

静态存储区,存放全局变量和静态变量,在执行程序前分配存储空间,占据固定的存储单元。

动态存储区,存放的是函数里的局部变量、函数的返回值、形参等,它在函数被执行的过程中进行动态分配,在执行完该函数时自动释放。由于这种分配和释放都是每次执行到函数时进行的,因此前后两次调用同一个函数,其临时变量分配到的地址可能是不同的。

注意事项

1、局部变量不能通过指针返回。原因是局部变量在函数执行结束已经被销毁,指针返回的地址已经被回收。

2、静态局部变量保存的值不会随着函数执行结束而回收。

3malloc申请的堆内存需要回收,不然会随着程序一直驻留在内存。

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;
}