虽然以下代码确实有效,但我不知道为什么。请解释一下。
#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()返回的指针仍然指向到应用程序内存中的有效地址(意思是&#34; Hello!&#34;成功发送到输出)。为什么呢?
同样的事情
const int *f()
{
int i = 5;
const int *p = &i;
return p;
}
int main()
{
cout << *f() << endl;
system("pause");
return 0;
}
任何人都可以对此有所了解吗?
答案 0 :(得分:2)
你学到的东西是正确的,不允许使用本地函数变量
在功能结束后不再(即他们用过的记忆)
如果它目前有效,那只不过是巧合:
在此期间没有其他代码使用过这段记忆
对于自己的东西,旧的价值仍然存在。
答案 1 :(得分:0)
您的第二个代码段会导致未定义的行为。 似乎工作的原因是,你很幸运,内存没有被覆盖。
但是(如下面提到的评论中)第一个片段有效。