2013-04-24 120 views
1

以下情況會讓我更加困惑。據我所知,局部變量不會被指針或引用返回。例如功能返回指針

char * foo() 
{ 
    return "Hello world"; 
} 

int* fooo() { 
    static int i = 100; 
    return &i; 
} 

這兩種情況會發生什麼?

+1

第一個不應該在現代C++中乾淨地編譯。 – chris 2013-04-24 03:28:34

+0

這意味着,像這樣返回是一個標準方法? – Srijeyanthan 2013-04-24 03:40:14

+2

我不會說這是「標準」。這是合法的,但這不是通用慣例。你能否給我們提供更多關於你想要完成的內容的信息,以及爲什麼你認爲你需要編寫這些代碼? – 2013-04-24 03:40:41

回答

5

字符串文字是靜態存儲的,當然static int i也是靜態的。您可以從函數返回指向靜態變量的指針,因爲它們不是局部變量,並且當您像堆棧分配變量一樣退出函數時它們不會被銷燬。在另一方面,你的第一個例子應該返回const char *

從C++標準節lex.string:

字符串文字......具有類型爲「n爲const char數組」和靜態存儲持續時間(basic.stc),其中n是如下面所定義,並且與給定的字符初始化的字符串的大小...

+0

感謝您的詳細解釋 – Srijeyanthan 2013-04-24 03:57:33

+0

答案也提到它,「當然'static int i'也是靜態的。您可以安全地返回指向所有靜態變量的指針。 – perreal 2013-04-24 03:58:42

0

第一代碼不能編譯。您可以將該字符串強制轉換爲char數組並返回。第二個代碼將被編譯,但是你的變量將超出範圍。因此,函數返回時的引用將不再有效。通過地址返回一個局部變量是不好的。是否有任何特定的原因想要這種行爲?

你可以new/malloc一個char數組或int,然後返回它。只要您不手動釋放/刪除內存,就可以保證範圍內存在變量。然後,您可以愉快地從其他功能訪問內存。

希望這會有所幫助。

+3

第二種情況下的變量是'static'。 – jogojapan 2013-04-24 03:36:33

+0

我沒有看到...靜態變量對函數不是本地的,所以你仍然有靜態變量的有效內存。但是,不應該有任何需要返回來自任何函數的靜態變量的地址,因爲它們可以在定義它的整個類中訪問。 – Bill 2013-04-24 03:38:33

+3

您在函數範圍內將類作用域中的'static'與'static'混淆。 – 2013-04-24 03:39:33

0

你的第一個功能是無效的,你應該返回

const char* 

,是的,你可以返回static變量不會忽略:當函數返回,因爲他們在靜態數據存儲段被alocalted它們不被破壞