变量的作用域和生存周期

本文深入探讨了变量的作用域和生命周期,包括局部变量和全局变量的区别,以及它们在函数调用过程中的行为。通过具体代码示例,解释了局部变量在函数结束后的销毁,全局变量的持久性,以及如何正确地使用函数返回的数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

举个例子:

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

posted on 2015-09-29 20:29  RunningSnail 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/tgycoder/p/4847223.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值