[英]Global pointer to a local variable in function
#include <iostream>
using namespace std;
int *ptr;
void func1() {
int a = 10;
ptr = &a;
}
int main()
{
func1()
cout << *ptr << endl;
return 0;
}
./a.out正确给出10。
在上面的代码中,“ a”是局部变量,其范围将在func1()之内。 根据我的理解,当激活该方法时,会分配一个称为激活记录的存储单元块,其中包含当前方法调用的所有局部变量和形式参数。 激活记录在方法执行期间使用,然后在执行结束时删除。 删除激活记录后,将破坏局部变量和形式参数的存储位置,并且丢失它们所包含的值。 但是在这里,在主功能上,打印存储在“ a”的内存地址中的值时,正确给出了10。 请澄清。
简短的答案:这是未定义的行为。
的确, &a
的值仅在func1
函数内部有效,在main
访问它是未定义的行为,它的值保持“有效”的原因可能是因为它仍在堆栈中,但您不应依赖未定义的行为。
&a处的值10保留在内存中,因为没有内容会覆盖它。 如果您要调用其他函数,则可能不会再得到10个。
这是非常危险的。 超出范围时,本地对象/变量将自动释放(释放),因此在范围外未定义局部变量的指针。
void func1() {
int a = 10; // local variable, goes out of scope on return from this function
ptr = &a; // pointer of local variable is RISKY to pass, as this will be gone
}
如果您需要内部变量的值,请按如下所示按值传递该值,例如,
int func1() {
int a = 10; // local variable, goes out of scope on return from this function
return a; // fine, as local variable will be copied to a temporary before return
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.