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