码迷,mamicode.com
首页 > 其他好文 > 详细

变量的作用域和生存周期

时间:2015-02-02 22:55:29      阅读:252      评论:0      收藏:0      [点我收藏+]

标签:

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

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

举个例子:

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

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

 运行结果:技术分享

使用new和delete,可以动态开辟和回收内存。

变量的作用域和生存周期

标签:

原文地址:http://www.cnblogs.com/tgycoder/p/4268669.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!