【问题标题】:Implement BST in c: segmentation fault在 c 中实现 BST:分段错误
【发布时间】:2015-03-17 04:41:41
【问题描述】:

我正在尝试在 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);
}

【问题讨论】:

  • put 永远不会改变 *node 所以它会使代码更简单地改变它以采用Node *node
  • 你错过了#include <stdlib.h>
  • 我已经包含了所有的库我只是没有在这里显示它
  • @MattMcNabb 不只是使用指针给我分段错误?因为我正在操作一个指针,所以我需要将一个指针传递给指针。
  • 你不是在操作指针,你只是改变它指向的东西

标签: c pointers binary-search-tree


【解决方案1】:

这行分配了错误的大小:

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

应该是:

Node *newNode = malloc( sizeof *newNode );

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

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

【讨论】:

  • 感谢您的帮助。但为什么是 *newNode 而不是 Node?​​span>
  • 我仍然遇到分段错误
  • @Jackdddddd 它有助于避免像你刚刚犯的错误。 see here 进一步阅读。
  • tree_walk 中可能存在错误。无论如何,debug your code,不要只是转储一大块代码并说“我遇到了段错误”。在诉诸于此之前,您可以进行大量调查。
猜你喜欢
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
  • 2019-01-22
  • 2023-03-10
相关资源
最近更新 更多