将 int 转换为 void 指针

新手上路,请多包涵

美好的一天,我刚开始学习 C++ 中的 void 指针,现在我正在编写二叉树,其中存储在每个节点中的值是指向值的 void 指针。

 struct TreeNode
{
    int count;
    void* data;
    TreeNode *left;
    TreeNode *right;
    };

问题出现在第一个方法添加方法中。我的方法现在采用 int aa 参数并且不返回任何内容一开始我创建了新节点。为此,我需要将整数转换为 void。程序编译并且第一个元素正确添加到根目录 - 但是当我向方法发送另一个数字时,它再次存储在根目录中。所以如果我主要有类似 tree.addToTree(12);树.addToTree(13);比它首先存储 12 和在 else 语句(下面的代码)之后存储 13 的 root-> 数据如何。

 void Tree::addToTree(int num)
{
    if(root==NULL){
        root= new TreeNode();
        root->data=#
        //((int *)(root->data)) = num;//i tried to convert to void* in this way but it give me segmentation fault
        root->left=NULL;
        root->right=NULL;
    }
    else{
        //here root value is already changed
        int *intPtr = static_cast<int*>(root->data);
        cout << "key2" << *intPtrT << endl;
        //TreeNode* current= insert(num,root);
    }
}

据我了解,那是因为我使用 &num 所以我的参数总是在一个地方撕裂,并且根“连接”到 &num 它也会改变。

我试图找到解决方案但没有成功。有没有办法 cat int 使指针无效?

原文由 aldebaran 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
1 个回答

首先,您应该决定是按值存储数据还是按指向它的指针存储数据。

在第一种情况下,指针是没用的,您可以使用如下模板:

 template <typename T>
struct TreeNode
{
  T data;
  ..
}

TreeNode<int> node;

这甚至适用于指针(如 T *data ... data = new int() )。

如果您想存储指向数据的指针,您还可以使用带有类型参数的模板或使用公共祖先类,然后使用所需类型对其进行子类化,例如:

 class TreeData {

}

class TreeDataInt {
  int value;
}

struct TreeNode
{
  TreeData *data;
  ..
}

最后,在 void* 指针中记录一个 int 是不鼓励的,在 C++ 中使用 void* 来实现多态性通常是不鼓励的,因为你有很多其他的工具更安全,更可靠。

如果您真的想将 int 存储在 void* 中,那么您应该使用 intptr_t 类型,它是一个可转换为指针的整数。例如:

 #include <cstdint>

intptr_t value = 50;
node->data = static_cast<void*>(value);
intptr_t value2 = static_cast<intptr_t>(node->data);

这会将整数的值直接保存为 void* 内的地址。这意味着您不能取消引用指针本身。

顺便说一句 root->data=&num 是错误的,因为您分配给 data 自动分配变量的地址,该地址在退出其范围时将变为无效。

原文由 Jack 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题