正在返回指向局部函数变量的指针
Returning pointer to local function variable
可能重复:
返回本地或临时变量的地址
可以使用局部变量';内存是否在其范围之外被访问?
我知道我不应该返回指向局部函数变量(局部堆栈变量)的指针,因为当函数返回时,变量将无效,堆栈将被清理,除非我将这些变量设置为静态或在堆上分配它们。
以下代码表明:
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)。这种行为在所有编译器中都常见吗?编译器如何允许我使用指向局部函数变量的指针来访问它所指向的值,尽管函数返回时变量无效?
您返回一个地址。返回地址始终有效。但在你的情况下,你也取消了对它的引用。这是未定义的行为。从理论上讲,对于未定义的行为,任何事情都可能发生。编译器甚至可以嵌入代码来格式化硬盘。实际上,它会在不进行任何检查的情况下取消引用地址。如果它仍然可以访问,它将返回该地址的值,否则将导致访问冲突。
你的地址在堆栈上,所以它总是可以访问的。根据您在其间进行的调用,该值可能仍然存在或不存在。所以在简单的情况下,你会得到价值,而在更复杂的情况下你不会。它有时甚至可能起作用,有时却不起作用。
有关更多信息,您应该阅读一些关于如何在汇编程序中进行函数调用的信息,以了解编译器在堆栈上做什么(放置参数、返回地址、放置局部变量、返回时堆栈清理、调用约定)。
它可以从堆栈中删除,因为它是本地的,但该值将保留,直到另一个值将其过度生成。这是c++不安全的语言u可以做很多奇怪的事情
相关文章:
- 未使用的C++未优化的静态成员函数/变量
- 内联函数/变量的外部链接
- 同一函数中的静态函数变量初始化顺序
- 将非静态成员函数C 的使用无效,而将成员功能作为函数变量
- 如何从doxygen输出中排除类的无证件成员函数/变量
- 如何在LUA C API中分配全局LUA函数变量
- 如何将函数变量传递给C lambda函数
- 通过另一个C++函数更改函数变量
- c++11 lambda 真的支持闭包吗?函数变量中存在语义冲突
- C++:静态成员不能在声明时定义,但静态函数变量可以?
- apache-frift是否支持函数变量作为参数
- 类函数/变量在使用之前必须声明
- 函数变量去哪里
- 无法使用函数变量?错误表达式必须具有类类型
- 如何在main中使用函数变量
- 每当尝试打印函数变量时,C++ cout 错误
- 是否存在查看成员函数/变量的整洁等效项
- 访问友元类之间的函数变量
- 函数到函数变量
- 一个定义规则是否强制创建一个静态函数变量