C++ 调用函数后的值,该函数通过引用传递给C++;?

C++ 调用函数后的值,该函数通过引用传递给C++;?,c++,C++,我无法理解为什么*p和*p1的值在下面的代码行中计算后会发生变化。谢谢你的帮助 void g(int *&x) { int a = 3; x = &a; } void h(const int *&x) { int b = 2; x = &b; } int main() { int *p = new int; *p = 5; g(p); cout << p << " " &l

我无法理解为什么*p和*p1的值在下面的代码行中计算后会发生变化。谢谢你的帮助

void g(int *&x) {
    int a = 3;
    x = &a;
}
void h(const int *&x) {
    int b = 2;
    x = &b;
}

int main() {
    int *p = new int;
    *p = 5;

    g(p);
    cout << p << " " << *p << endl; // 0095FD48 3 *why the value change in the next line? *
    cout << p << " " << *p << endl; // 0095FD48 1829755776 
    const int*p1 = p;
    h(p1);
    cout << p << " " << *p << endl; // 0095FD48 2 *in here it happen, too*
    cout << p << " " << *p << endl; // 0095FD48 1829755776 
}
void g(int*&x){
INTA=3;
x=&a;
}
无效h(常数int*&x){
int b=2;
x=&b;
}
int main(){
int*p=新的int;
*p=5;
g(p);
cout
g()
h()
将局部变量的地址分配给参数,从而将地址公开给调用者。当这些函数返回时,局部变量被释放,即,它在堆栈上的位置可以重新使用

因此,这是未定义的行为。在您的示例中,这是“免费后使用”的情况


调用
cout
及其
operator两个函数
g()
h()
会暴露未定义的行为。您的答案的可能副本非常有用,非常感谢。但是有一些事情我仍然感到困惑。您能为我解释一下吗?您所说的“从而向调用方公开地址”是什么意思和“使用堆栈的某些部分并覆盖“以前的局部变量”。@HoangNguyen——概念很简单。您存储的是局部变量的地址。当
g()
h()时
returns,该局部变量不再存在。既然该变量消失了,那么在函数返回后,你指的是什么?@PaulMcKenzie我理解你的意思,但我弄不明白为什么第一行中的*p=3的值仍然存在,而下一行中的值却会随之变化。这意味着该局部变量在之后消失了cout的第一行对吗?不,它在那之前消失了-你只是幸运地看到了你期望看到的东西。例如,如果你在调用“g”之后调用另一个函数,在使用cout之前,你可能会发现第一行的值也发生了变化。@HoangNguyen——局部变量有一个生存期,当函数被重新调用时,这个生存期就结束了转换,因此该地址可供编译器自由使用。通过输出值,您只是在玩一个地址的游戏,而该地址不再可以由您的程序以定义的方式使用(简单明了)。因此,程序的行为是未定义的。