双指针的问题

时间:2012-11-16 01:49:30

标签: c++ pointers segmentation-fault

当我尝试使用下面第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;

3 个答案:

答案 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 );