当我尝试使用下面第15行中的指针变量* temp创建一个新的Node对象时,我遇到了分段错误。我仍然是c ++的新手,以及双指针如何工作,特别是与&组合使用时。谢谢你的帮助。
void bst::insert(int n) {
Node **temp;
Node *r, *parent;
// Tree is empty
if (root == NULL) {
root = new Node;
root->parent = NULL;
root->value = n;
root->left = NULL;
root->right = NULL;
root->isBlack = true;
} else {
r = root;
// Create a node with the given value, n
(*temp) = new Node;
(*temp)->value = n;
(*temp)->left = NULL;
(*temp)->right = NULL;
(*temp)->isBlack = false;
答案 0 :(得分:5)
变量temp
未初始化。因此,尝试取消引用temp
将失败,因为没有取消引用的价值。如果你真的需要指向指针的指针,你可以只声明单指针并使用&
运算符来获得双指针。
答案 1 :(得分:2)
temp
并未指出任何有效内容,因此当您执行
(*temp) = new Node;
(*temp)->value = n;
(*temp)->left = NULL;
(*temp)->right = NULL;
(*temp)->isBlack = false;
在else
语句的if
分支中,当您取消引用temp
指针变量时,您将调用未定义的行为。
答案 2 :(得分:1)
看起来你不想在这里使用双指针(或指向指针的指针,因为我更喜欢称它们)。 temp
包含一个永不初始化的指针地址。因此,当您尝试创建new Node
时,您尝试使用已初始化的任何随机数据temp
创建它。
您可以使用普通指针,然后如果您需要将其指向指针,请稍后使用&temp
:
Node * temp;
// <snip>
temp = new Node;
Node->value = n;
// etc.
SomeFunc( &temp ); // temp will be passed as a pointer-to-pointer (Node**).
或者,如果你坚持认为temp仍然是一个指向指针的指针,你可以使用:
Node * temp2 = new Node; // Creates a new Node and assigns the address to temp2
temp = &temp2; // Assigns the address of the pointer to the Node (temp2) to temp.
// Now do stuff.
请记住,你需要删除它:
delete( *temp );