在c中实现BST:分段错误

时间:2015-03-17 04:41:42

标签: c pointers binary-search-tree

我正在尝试在c中实现二进制搜索树。我使用lldb来跟踪我的代码,我发现当函数PUT返回时,它返回一个带有key = 5和value = 9的节点指针,并将它分配给main中的节点指针P.

然而,当我将它传递给tree_walk函数并尝试打印出所有内容时,它给了我一个分段错误。任何人都可以告诉我的代码有什么问题。谢谢

typedef struct Node{
    int key;
    int value;
    int size;
    struct Node *left;
    struct Node *right;
}Node;

Node* put(Node **node, int k, int val){
    if(*node == NULL){
        Node *newNode = (Node *)malloc(sizeof(Node*));
        newNode->key = k;
        newNode->value = val;
        return newNode;
    }else if((*node)-> key == k){
        (*node)->value = val;
    }else{

        int cmp = k > ((*node)->key) ? 1 : 0;

        Node **ptr = NULL;

        if(cmp == 1){
            ptr = &((*node)->right);
            (*node)->right = put(ptr, k, val);
        }else{
            ptr = &((*node)->left);
            (*node)->left = put(ptr, k ,val);
        }
    }
    (*node)->size = size((*node)->left) + size((*node)->right) + 1;
    return *node;
}

int main(void){

    Node *p = NULL;
    p = put(&p, 5,9);
    tree_walk(p);
}

1 个答案:

答案 0 :(得分:3)

此行分配错误的大小:

Node *newNode = (Node *)malloc(sizeof(Node*));

应该是:

Node *newNode = malloc( sizeof *newNode );

您只为指针分配了足够的空间,而不是Node

另一个问题是,您永远不会初始化newNode->leftnewNode->right。如果tree_walk函数尝试读取它们,则会导致未定义的行为。