【问题标题】:pointer won't go back to it's reference from a function after return (stays null) C++返回后指针不会从函数返回到它的引用(保持为空)C++
【发布时间】:2016-04-24 23:27:28
【问题描述】:

我使用的是我自己用 stuct 制作的链表。该结构有 2 个整数和 1 个指向另一个结构的指针,下一个。

我正在使用 LL(链表),但在其中一个函数中,某个指针不会改变。

AddChain( &MakeChain(..values..), added )

这就是我调用该函数的方式,我向她发送一条新链以链接到大链,如果没有大链,则它为 NULL,因此它将替换它。在此调用中添加了一个 NULL ptr 到链结构。

void AddChain(PolyChain* pol, PolyChain* main) // adds the new piece to the chain
{
    PolyChain *current = main, *back = NULL;

    if (main == NULL)
    {
        pol->next = NULL;
        main = pol;
        return;
    }
... \\ there is continuation of the function but it wont get so far without main one
}

现在,您可以看到主链是否为 NULL,我使用它来引用与我得到的新链相同的东西。我在调试器中运行,并且 pol HAS 有一个值并在行之后:

main = pol;

main 实际更改为指向 pol 指向的内容。但是在 AddChain 中返回后,AddChain 中 mainadd 仍然是 NULL。它没有从函数中取回值,也没有像按值而不是按引用那样更改添加的指针,而是按引用。

是什么导致了这个问题?

编辑:MakeChain 返回一个 PolyChain,AddChain 得到 PolyChain*,这就是我使用 & 的原因。

【问题讨论】:

  • 您按值传递指针。想想吧。

标签: c++ function pointers return


【解决方案1】:

你必须使用指针来修改函数内部的指针值

void AddChain(PolyChain* pol, PolyChain** main)

比你的代码:

void AddChain(PolyChain* pol, PolyChain** main) // adds the new piece to the chain
{
    PolyChain *current = *main, *back = NULL;

    if (main == NULL)
    {
        pol->next = NULL;
        *main = pol;
        return;
    }
... \\ there is continuation of the function but it wont get so far without main one
}

将值传递给函数只需调用

AddChain(pol, &main);

其中polmain 是指向PolyChain 类型的常规指针。

或使用简单的值:

PolyChain* pMain = &main;
AddChain(&pol, &pMain);

注意:这种做法极易出错,因此您必须格外小心以这种方式管理指针。

【讨论】:

  • 当我尝试使用 &(&L)) 传递 PolyChain 时,我遇到了常规类型的问题
  • @Ofek .T.编译器说了什么?
  • 用 &(&) 表示 - 表达式必须是左值或函数指示符
  • @Ofek .T.你试过最后一个例子吗?
  • 当然指针地址 (&*) 会起作用,但这会强制每次我想使用该函数来发送它,然后接收它时创建一个指针,该变量将毫无意义对我来说,这只是代码使用方面的额外工作
【解决方案2】:

您正在更改指针的副本,因为您是按值传递指针。如果要更改来自调用范围的指针,则必须将指针传递给指针或对指针的引用:

void AddChain(PolyChain*& pol, PolyChain*& main) {...}

【讨论】:

    【解决方案3】:

    发生这种情况是因为您通过值传递了指针PolyChain* main。可视化“按值传递”的一种简单方法是将其视为“按副本传递”:指针的副本是专门为AddChain 的调用而制作的。这就是为什么对 AddChain 内的指针所做的任何更改都保留在 AddChain 的本地。

    您可以通过三种不同的方式解决此问题:

    • 参考PolyChain*& main - 这是最简单的解决方案。因为没有其他东西需要改变。
    • 通过指针获取PolyChain** main - 在这种情况下AddChain 需要取消引用main,即使用*main 而不是main,并在何时获取指针将main 传递给AddChain
    • 用新值main 返回PolyChain* - 在这种情况下,调用者必须将结果分配回为main 传递的指针。

    【讨论】:

      【解决方案4】:
      void AddChain(PolyChain* pol, PolyChain* main)
      ...
              main = pol;
              return;
      

      在该代码中,main 是传入的任何指针的本地副本,因此分配给 main 对函数外部的指针没有影响。

      您没有提供足够的信息让我推断出您的意图,因此很可能(但不清楚)您可以通过引用传递指针来解决问题:

      void AddChain(PolyChain* pol, PolyChain*& main)
      

      【讨论】:

      • 但是如果我这样做了,如何将 PolyChain 传递给函数?使用 PolyChain* 我只会做 &variable_name,但现在这不适合
      • @Ofek .T.以相同的方式。 AddChain(&pol, &main) 其中polmainPolyChain 类型的变量。
      • 它没有。 PolyChain l = MakeChain(2, 2, NULL); AddChain(&MakeChain(1, 4, NULL), &l);给我错误说它不正确
      • @Ofek .T.你有没有尝试做,我发布了亲爱的?它当然必须有效。
      • @Ofek .T.我还注意到你的 make 链函数返回一个值。你把它放在哪里了?
      猜你喜欢
      • 2013-10-14
      • 1970-01-01
      • 2010-12-25
      • 2023-03-28
      • 2021-07-14
      • 2022-11-21
      • 1970-01-01
      • 2011-05-22
      • 2011-02-19
      相关资源
      最近更新 更多