美好的一天,我刚开始学习 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 许可协议
首先,您应该决定是按值存储数据还是按指向它的指针存储数据。
在第一种情况下,指针是没用的,您可以使用如下模板:
这甚至适用于指针(如
T *data ... data = new int()
)。如果您想存储指向数据的指针,您还可以使用带有类型参数的模板或使用公共祖先类,然后使用所需类型对其进行子类化,例如:
最后,在
void*
指针中记录一个int
是不鼓励的,在 C++ 中使用void*
来实现多态性通常是不鼓励的,因为你有很多其他的工具更安全,更可靠。如果您真的想将
int
存储在void*
中,那么您应该使用intptr_t
类型,它是一个可转换为指针的整数。例如:这会将整数的值直接保存为
void*
内的地址。这意味着您不能取消引用指针本身。顺便说一句
root->data=&num
是错误的,因为您分配给data
自动分配变量的地址,该地址在退出其范围时将变为无效。