變量的作用域和生存周期


局部變量的作用域一般認為在函數體內有效,其內存分配管理和銷毀由編譯器來實現。當函數執行完成返回時,局部變量將全部銷毀,則其生命周期也隨之結束。

全局變量的生命周期等於程序執行時間,程序開始執行時,全局變量將被初始化。

舉個例子:

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函數中還是存在。所以可用動態申請內存的方式來返回一個數組的地址。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM