变量的作用域和生存周期

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

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

举个例子:

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函数中还是存在。所以可用动态申请内存的方式来返回一个数组的地址。

时间: 2024-10-16 17:06:51

变量的作用域和生存周期的相关文章

浅析变量的作用域和生存周期的区别

作用域:在一定的空间范围内能够使用. 生存周期:在一定的时间范围内存在. example: int f(int x){ static int k=0; x+=k++; return x; } 求f(f(2)); 这个结果是2,其中上例中k是一个静态局部变量,它的作用域就是本函数体内部,而它的生存周期确实一直有效,也就是说该变量一旦声明了之后,在内存开辟了一个单元用来存放它,只有在该函数内部才能使用,在外部是不能使用的,但是它是一直存在的,它原先的值还是保存在那儿的,所以f(2)得到k=1,x=2

浅析变量的作用域和生存周期的差别

作用域:在一定的空间范围内可以使用. 生存周期:在一定的时间范围内存在. example: int f(int x){ static int k=0; x+=k++; return x; } 求f(f(2)); 这个结果是2.当中上例中k是一个静态局部变量.它的作用域就是本函数体内部.而它的生存周期确实一直有效,也就是说该变量一旦声明了之后.在内存开辟了一个单元用来存放它,仅仅有在该函数内部才干使用,在外部是不能使用的.可是它是一直存在的,它原先的值还是保存在那儿的.所以f(2)得到k=1,x=

Java知多少(20)变量的作用域

在Java中,变量的作用域分为四个级别:类级.对象实例级.方法级.块级. 类级变量又称全局级变量或静态变量,需要使用static关键字修饰,你可以与 C/C++ 中的 static 变量对比学习.类级变量在类定义后就已经存在,占用内存空间,可以通过类名来访问,不需要实例化. 对象实例级变量就是成员变量,实例化后才会分配内存空间,才能访问. 方法级变量就是在方法内部定义的变量,就是局部变量. 块级变量就是定义在一个块内部的变量,变量的生存周期就是这个块,出了这个块就消失了,比如 if.for 语句

6.Java变量的作用域

在Java中,变量的作用域分为四个级别:类级.对象实例级.方法级.块级. 类级变量又称全局级变量或静态变量,需要使用static关键字修饰,你可以与 C/C++ 中的 static 变量对比学习.类级变量在类定义后就已经存在,占用内存空间,可以通过类名来访问,不需要实例化. 对象实例级变量就是成员变量,实例化后才会分配内存空间,才能访问. 方法级变量就是在方法内部定义的变量,就是局部变量. 块级变量就是定义在一个块内部的变量,变量的生存周期就是这个块,出了这个块就消失了,比如 if.for 语句

c++变量的作用域、生存期和可见性

局部变量 范围:在一个函数内部定义的变量,作用范围只限于本函数体内. 生存期:程序执行到本函数才会给局部变量分配内存单元,函数执行完毕局部变量所占的存储单元就被释放 全局变量 在函数体外部定义的变量是全局变量,可以被本文件所有其他函数访问使用. 作用域:所有文件.在一个cpp定义的全局变量在另一个cpp中使用,应该在使用它的函数体内部或外部进行extern说明 生存期:全局变量在程序的全部执行过程中占用固定的内存单元,生存周期是整个程序运行期间. 实验代码 /* * 变量的作用域.生存期和可见性

C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期

全局变量 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件.) 生命周期:程序运行期一直存在 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量. 内存分布:全局数据区 注意:如果在两个文件中都定义了相同名字的全局变量,连接出错:变量重定义 全局静态变量 作用域:文件作用域(只在被定义的文件中可见.) 生命周期:程序运行期一直存在 内存分布:全局数据区 定义方法:static关键字,const 关键字 注意:只要文件不互相包含,在两个不同的文件中

第四章—变量,作用域和内存问题(二)

第四章-变量,作用域和内存问题(二) JS没有块级作用域 js没有块级作用域,这个概念容易导致误解,这里就区分下几个情况,大家好好参考下: 我们知道,在其他类C的语言中,由花挂号封闭的代码块都有自己的作用域.但是在JS中,却没有块级作用域: 这里if(true){}代表条件永真,永远执行这条.if(false){}的话就是永远不执行这条. 这个代码执行之后,在if语句定义的变量,在if语句外可以访问的到.在if语句中的变量声明会将变量添加到当前的执行环境中(这里是全局环境). 还有如下的两个例子

Js中变量的作用域

一.理解函数作用域需要理解以下几点:    1.函数变量的作用域有全局变量和局部变量两种,全局变量写在函数的最前面,局部变量写在函数体内,局部变量省略了var 也就默认成为了全局变量!    2.函数体内部可以读取到函数外的变量,而函数外不能读取到函数内的变量! 在理解了函数变量的作用域之后,也需要理解函数的作用域链了:    1.每一个函数都有一个与之相关的作用域链,当js在查找变量X时,它会从链的第一个对象开始查找,如果这个对象有一个名为X的属性值,则会直接使用这个 属性值,如果没有就继续下

C的日记-变量的作用域、生存期和内存位置

“天地玄黄,宇宙洪荒”,先有天地,之后方有古今.变量同是,先有变量的作用域(存在的地点),然后出现了变量的生存期(存在的时间). [变量存储的方式]首先变量实际上是存放到两个区域的: 静态存储区:是指在程序运行区间由系统分配固定的存储空间的方式. 动态存储区:程序运行期间根据需要动态的分配存储空间. [变量分类] 局部变量:在[函数]内部声明的变量. [作用域]:从定义变量的位置到本函数结束. <1>自动变量(auto变量),即动态局部变量,不专门声明为static的变量.