【发布时间】:2023-03-03 12:56:01
【问题描述】:
**So recently i came up with a question in an interview it was based on pointers**
void fun(int *p){
int q = 10;
p = &q;
}
int main() {
int r = 20;
int *p = &r;
fun(p);
cout<<*p<<endl;
}
*我的问题是 (1)证明内存分配的结果是如何发生的? (2)如何通过引用传递这个指针变量(我在void fun()的参数中写了*&p)当我这样做时我观察到p正在打印一个垃圾值,现在首先我认为可能很有趣有不同的内存分配,当它从 fun 函数中获取 q 的地址时,它的地址发生了变化,但是 main 函数中的地址指向了一些垃圾值,我说得对吗,请解释一下?
【问题讨论】:
-
这能回答你的问题吗? Passing references to pointers in C++
-
@Ch3steR - 错误。在
fun()中对p的赋值在main()中没有可见的效果。由于main()中p的值被初始化为r的地址,并且没有改变,所以输出是r的值。即 20。如果fun()通过引用接受指针,则代码将具有您所描述的未定义行为。 -
是的,你能解释一下这是怎么发生的以及为什么会发生吗,我只是想请一个对此感到非常满意的人来澄清一下,非常感谢你:)
-
@Peter 是的,这就是我的意思。我假设通过 OP 代码中的指针进行引用。删除评论,因为它具有误导性。
-
在
*&p之后得到一个垃圾结果几乎是意料之中的。p指向q,但q在fun末尾超出范围,并且当*p打印在main中时不再有效。访问一个过期的变量就是所谓的Undefined Behaviour,当行为没有被定义时,你不能确切地说出会发生什么。你可以得到垃圾。你可以得到 10 个。你可以得到像独角兽雨一样的完全幻想。但你可能会得到垃圾或 10 个。