2014-11-24 159 views
-1

雖然下面的代碼確實有效,但我不知道爲什麼。請解釋我。返回const char的函數*

#include <iostream> 

using namespace std; 

const char *f() 
{ 
    const char *p = "Hello!\n"; 

    return p; 
} 

int main() 
{ 
    cout << f() << endl; 
    system("pause"); 
    return 0; 
} 

從我瞭解到,在F中的7個字符()是在棧上分配(?),這意味着他們的記憶將盡快公佈爲f()結束,然而,指針爲f返回()仍指向應用程序內存中的有效地址(表示「Hello!」已成功發送到輸出)。爲什麼?

同樣的事情會爲

const int *f() 
{ 
    int i = 5; 
    const int *p = &i; 

    return p; 
} 

int main() 
{ 
    cout << *f() << endl; 
    system("pause"); 
    return 0; 
} 

任何人都可以闡明這一些輕?

回答

0

您的第二個代碼片段會導致未定義的行爲。 似乎工作的原因是,你很幸運,內存沒有被覆蓋。

但是(正如在下面提到的評論中)第一個片段是有效的。

+1

只有第二個片段調用UB,第一個就好了。 – 2014-11-24 13:42:52

2

學到了什麼......你是正確的,it's 允許使用本地函數變量
(即他們所使用的內存)的函數結束後了。
如果它現在的作品只不過是巧合:
沒有其他代碼在此期間使用這段內存爲自己的東西,所以舊值仍然存在。

相關問題