繁体   English   中英

指向函数中局部变量的全局指针

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM