【问题标题】:Passing the pointers by refrence?通过引用传递指针?
【发布时间】: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 代码中的指针进行引用。删除评论,因为它具有误导性。
  • *&amp;p 之后得到一个垃圾结果几乎是意料之中的。 p 指向q,但qfun 末尾超出范围,并且当*p 打印在main 中时不再有效。访问一个过期的变量就是所谓的Undefined Behaviour,当行为没有被定义时,你不能确切地说出会发生什么。你可以得到垃圾。你可以得到 10 个。你可以得到像独角兽雨一样的完全幻想。但你可能会得到垃圾或 10 个。

标签: c++ pointers


【解决方案1】:
void fun(int *&p) {
    int q = 10;
               // here the object q began its existence
    p = &q;
               // here you pass the address of that object *out*
               // of the function, to the caller

               // here the object q ceases to exist
               // question: does anyone have now-invalid pointers that
               //    pointed to that object?
}

您当然会立即看到,是的,fun 的调用者有一个不指向有效对象的指针(不存在的对象根据定义是无效的)。这是未定义的行为。任何事情都有可能发生。

无论你观察到什么都和其他人观察到的一样好 :) 我可以让这段代码在几乎任何编译器上假装工作,或者假装失败——这只是以某种方式安排事情的问题。当然,这并没有使代码更有效,而且“工作”或“失败”的概念无论如何都是没有意义的:代码是无效的,就 C++ 而言,关于效果的讨论是无效的,因为好吧:)

【讨论】:

    猜你喜欢
    • 2014-07-27
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    相关资源
    最近更新 更多