zoukankan      html  css  js  c++  java
  • 变量的作用域和生存周期

    局部变量的作用域一般认为在函数体内有效,其内存分配管理和销毁由编译器来实现。当函数执行完成返回时,局部变量将全部销毁,则其生命周期也随之结束。

    全局变量的生命周期等于程序执行时间,程序开始执行时,全局变量将被初始化。

    举个例子:

    int tmp;
    int main()
    {
        for(int i = 0;i< 100;++i)
      {
            ...;
            ...;       
      }
    }
     

    可知i就是for循环内的一个局部变量,如果在for循环的花括弧外访问i,则会提示如下错误:

    error C2065: ‘i’ : undeclared identifier

    tmp就是一个全局变量,程序中的任何函数都可以访问它,这实现了数据共享。但任何函数也可以修改这个全局变量,使数据发生被篡改的可能。

    再举个例子说明一下,关于函数返回值的问题:

    #include "stdafx.h"
    #include <iostream>
     
    //using namespace std;//不建议直接使用
    using std::cout;//用到哪个就using 哪个,虽然麻烦,但是这是一个好的习惯
    using std::endl;
    int *test()
    {
        int intArray[3] = {0,1,2};
        return intArray;
    }
     
    int main()
    {
        int *ptrArray;
        ptrArray = test();
        for(int i = 0;i < 3;++i)
            cout<<ptrArray[i]<<' ';
        cout<<endl;
        return 0;
    }
     

    该程序编译时会出现如下警告:warning C4172: returning address of local variable or temporary

    运行结果:  

    看到这大家可能感到奇怪,为什么输出不是0,1,2呢?

    这是因为test函数运行结束,返回main函数,其函数体内的所有变量(stack分配)都被系统回收。所以ptrArray指向的那块内存已被释放掉了,以致出现不是0,1,2。

    那么问题来了,该如何使用返回的数组呢?

    方法一:使用静态变量,即”static int intArray[3] = {0,1,2};”即可。静态变量的初始化只有一次,当函数第一次被调用时就对静态变量进行初始化。一旦声明为静态变量,只要程序不退出,那么静态变量就一直存在。需要注意的时,虽然局部的静态变量可以一直随着程序运行存在,相当于非静态局部变量来说其生命周期延长了,但是其作用域并没有发生改变,还只能限制在函数体内访问。

    方法二:

    #include "stdafx.h"
    #include <iostream>
     
    using std::cout;
    using std::endl;
    int *test()
    {
        int *intArray = new int[3];
        for(int i = 0;i < 3;++i)
            intArray[i] = i;
        return intArray;
    }
     
    int main()
    {
        int *ptrArray;
        ptrArray = test();
        for(int i = 0;i < 3;++i)
            cout<<ptrArray[i]<<' ';
        cout<<endl;
        delete []ptrArray;
        return 0;
    }
     

    运行结果:

    由于在test中的intArray是用new动态申请的内存,那么释放必须由我们手动释放。所以在程序未结束,且未使用delete[]释放申请的内存时,它在main函数中还是存在。所以可用动态申请内存的方式来返回一个数组的地址。

  • 相关阅读:
    js数组的用法以及数组根据下标(数值或字符)移除元素
    组件创建、组件注册方式
    vue.runtime.esm.js:593 [Vue warn]: Invalid prop: custom validator check failed for prop "value".报错解决
    uni-app 子组件如何调用父组件的方法
    wap2app(十)--wap2app 添加原生底部导航,添加原生标题栏,填坑
    wap2app(九)-- 使用mui.previewImage之后,页面a链接不能跳转
    wap2app(八)-- iphoneX 底部导航的兼容问题
    wap2app(七)-- 长按保存图片
    我的新书《Android App开发从入门到精通》终于出版啦
    Android微信登录、分享、支付
  • 原文地址:https://www.cnblogs.com/tgycoder/p/4847223.html
Copyright © 2011-2022 走看看