可能是重复问题:
返回本地或临时变量的地址
可以访问局部变量的内存吗?
我知道不应该返回指向本地函数变量(本地堆栈变量)的指针,因为当函数返回时,除非我将这些变量设置为静态或在堆上分配它们,否则这些变量将无效并且堆栈将被清除。
以下代码演示了这一点:
const char* v1() {
return "ABC";
}
const char* v2() {
string s = "DEF";
return s.c_str();
}
const char* v3() {
static string s = "JHI";
return s.c_str();
}
cout << v1() << endl; // Output: ABC
cout << v2() << endl; // Output: garbage (♀ ╠╠╠╠╠╠╠╠)
cout << v3() << endl; // Output: JHI
然而,我返回了指向原始局部函数变量的指针,并且能够获取它的值,尽管它不是静态的,如下面的代码所示:
int i1() {
int i = 5;
return i;
}
int* i2() {
int i = 6;
return &i;
}
int* i3() {
static int i = 7;
return &i;
}
cout << i1() << endl; // Output: 5
cout << *i2() << endl; // Output: 6 !!
cout << *i3() << endl; // Output: 7
编译器只是给出了警告,我正在返回本地变量或临时变量的地址(Visual C++ 2008)。这种行为是否适用于所有编译器?编译器如何允许我使用指向局部函数变量的指针来访问它指向的值,尽管该变量在函数返回时被使无效?