【问题标题】:How to modify pointer reference to struct member variable如何修改对结构成员变量的指针引用
【发布时间】:2020-05-03 13:12:27
【问题描述】:

我想用 C++ 创建 BST。当我尝试将指针分配给新节点时 - 它不会改变。函数调用后它仍然具有随机值。可以按照我的方式去做吗?

struct wezel {
  int value;
  wezel *l_val;
  wezel *r_val;

  wezel(int aValue) {
    value = aValue;
    l_val = NULL;
    r_val = NULL;
  }
};

struct tree {
   wezel *root;

   tree(wezel *aNode) {
     root = aNode;
   }
};

void addNode(int aValue, wezel aNode) {
   if(aValue < aNode.value) {
      if(aNode.l_val == NULL) {
            wezel pt = wezel(aValue);
            wezel *point = &pt;
        aNode.l_val = point; //do not work
      } else {
        return addNode(aValue, *aNode.l_val);
      }
   } else if(aValue > aNode.value) {
      if(aNode.r_val == NULL) {
            wezel pt = wezel(aValue);
            wezel *point = &pt;
        aNode.r_val = point; //do not work
      } else {
        return addNode(aValue, *aNode.r_val);
      }
   }

};

【问题讨论】:

  • point 指向pt,但ptif 块结束后不存在。 l_val 现在指向 wezel 曾经存在但不再存在的位置。

标签: c++ pointers struct


【解决方案1】:
wezel pt = wezel(aValue);
wezel *point = &pt;
aNode.l_val = point;

在这里,您正在创建一个 wezel 类型的 pt 对象,一旦超出范围就会被销毁,而指针 'point' 和 aNode.l_val 仍然指向它的地址。 (顺便说一下,“point”在离开作用域时也会被破坏。)

相反,您应该创建一个新对象,像这样链接到 aNode.l_val:

aNode.l_val = new wezel(aValue);

并且不要忘记使用相应的“删除”语句正确处置您的节点。

【讨论】:

  • 输出还是一样的。我认为这是因为您无法更改函数内部的指针引用 - 我不知道如何处理
  • 您是否也在 else-if 块中进行了类似的更改?
  • 是的。看来你只能改变 ponter 的价值,而不是他的参考。
  • 最终通过更改为 void addNode(int aValue, wezel *aNode) 解决了这个问题 - 以前我是按值传递 wezel
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
  • 2023-03-12
相关资源
最近更新 更多