以下情況會讓我更加困惑。據我所知,局部變量不會被指針或引用返回。例如功能返回指針
char * foo()
{
return "Hello world";
}
int* fooo() {
static int i = 100;
return &i;
}
這兩種情況會發生什麼?
以下情況會讓我更加困惑。據我所知,局部變量不會被指針或引用返回。例如功能返回指針
char * foo()
{
return "Hello world";
}
int* fooo() {
static int i = 100;
return &i;
}
這兩種情況會發生什麼?
字符串文字是靜態存儲的,當然static int i
也是靜態的。您可以從函數返回指向靜態變量的指針,因爲它們不是局部變量,並且當您像堆棧分配變量一樣退出函數時它們不會被銷燬。在另一方面,你的第一個例子應該返回const char *
,
從C++標準節lex.string:
字符串文字......具有類型爲「n爲const char數組」和靜態存儲持續時間(basic.stc),其中n是如下面所定義,並且與給定的字符初始化的字符串的大小...
感謝您的詳細解釋 – Srijeyanthan 2013-04-24 03:57:33
答案也提到它,「當然'static int i'也是靜態的。您可以安全地返回指向所有靜態變量的指針。 – perreal 2013-04-24 03:58:42
第一代碼不能編譯。您可以將該字符串強制轉換爲char數組並返回。第二個代碼將被編譯,但是你的變量將超出範圍。因此,函數返回時的引用將不再有效。通過地址返回一個局部變量是不好的。是否有任何特定的原因想要這種行爲?
你可以new/malloc一個char數組或int,然後返回它。只要您不手動釋放/刪除內存,就可以保證範圍內存在變量。然後,您可以愉快地從其他功能訪問內存。
希望這會有所幫助。
你的第一個功能是無效的,你應該返回
const char*
,是的,你可以返回static
變量不會忽略:當函數返回,因爲他們在靜態數據存儲段被alocalted它們不被破壞
第一個不應該在現代C++中乾淨地編譯。 – chris 2013-04-24 03:28:34
這意味着,像這樣返回是一個標準方法? – Srijeyanthan 2013-04-24 03:40:14
我不會說這是「標準」。這是合法的,但這不是通用慣例。你能否給我們提供更多關於你想要完成的內容的信息,以及爲什麼你認爲你需要編寫這些代碼? – 2013-04-24 03:40:41