C++函式返回區域性變數指標的問題
阿新 • • 發佈:2019-01-26
全域性變數
作用域:全域性作用域(全域性變數只需在一個原始檔中定義,就可以作用於所有的原始檔。)
生命週期:程式執行期一直存在
引用方法:其他檔案中要使用必須用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很久了,一直都想寫點東西,今天終於出手了。水平有限,只能跟大家分享一些基礎知識的總結,以共勉,共同提升。