2014-11-24 85 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 允许使用本地函数变量
(即他们所使用的内存)的函数结束后了。
如果它现在的作品只不过是巧合:
没有其他代码在此期间使用这段内存为自己的东西,所以旧值仍然存在。

相关问题