1. 程式人生 > >C++函式返回區域性變數指標的問題

C++函式返回區域性變數指標的問題





全域性變數


作用域:全域性作用域(全域性變數只需在一個原始檔中定義,就可以作用於所有的原始檔。) 
生命週期:程式執行期一直存在 
引用方法:其他檔案中要使用必須用extern 關鍵字宣告要引用的全域性變數。 
記憶體分佈:全域性資料區 
注意:如果在兩個檔案中都定義了相同名字的全域性變數,連接出錯:變數重定義 
例子: 
+ expand sourceview plaincopy to clipboardprint?//defime.cpp   
int g_iValue = 1;  

//main.cpp   
extern int g_iValue;  

int main()  
{  
    cout << g_iValue;  

    return 0;  
}  
//defime.cpp
int g_iValue = 1;


//main.cpp
extern int g_iValue;


int main()
{
    cout << g_iValue;
    return 0;






全域性靜態變數


 作用域:檔案作用域(只在被定義的檔案中可見。)
生命週期:程式執行期一直存在
記憶體分佈:全域性資料區
定義方法:static關鍵字,const 關鍵字
注意:只要檔案不互相包含,在兩個不同的檔案中是可以定義完全相同的兩個靜態變數的,它們是兩個完全不同的變數
例子:
+ expand sourceview plaincopy to clipboardprint?const int iValue_1;  

static const int iValue_2;  
static int iValue_3;  

int main()  
{  
    return 0;  
}  
const int iValue_1;
static const int iValue_2;
static int iValue_3;


int main()
{
    return 0;






靜態區域性變數


作用域:區域性作用域(只在區域性作用域中可見)
生命週期:程式執行期一直存在
記憶體分佈:全域性資料區
定義方法:區域性作用域用中用static定義
注意:只被初始化一次,多執行緒中需加鎖保護
例子:
+ expand sourceview plaincopy to clipboardprint?void function()  

{  
    static int iREFCounter = 0;  
}  
void function()
{
    static int iREFCounter = 0;






區域性變數


作用域:區域性作用域(只在區域性作用域中可見)
生命週期:程式執行出局部作用域即被銷燬
記憶體分佈:棧區
注意:auto指示符標示
      還有一點要說明,掌握static關鍵字的使用很關鍵。以下是引用別人的一些經驗之談:


Tips:


若全域性變數僅在單個C檔案中訪問,則可以將這個變數修改為靜態全域性變數,以降低模組間的耦合度;
若全域性變數僅由單個函式訪問,則可以將這個變數改為該函式的靜態區域性變數,以降低模組間的耦合度;
設計和使用訪問動態全域性變數、靜態全域性變數、靜態區域性變數的函式時,需要考慮重入問題,因為他們都放在靜態資料儲存區,全域性可見;
如果我們需要一個可重入的函式,那麼,我們一定要避免函式中使用static變數(這樣的函式被稱為:帶“內部儲存器”功能的的函式)
函式中必須要使用static變數情況:比如當某函式的返回值為指標型別時,則必須是static的區域性變數的地址作為返回值,若為auto型別,則返回為錯指標。 


來CSDN很久了,一直都想寫點東西,今天終於出手了。水平有限,只能跟大家分享一些基礎知識的總結,以共勉,共同提升。