【问题标题】:Segmentation fault error in insertion operation插入操作中的分段错误错误
【发布时间】:2015-04-01 11:23:35
【问题描述】:

我想写一个通用的二叉搜索树。 当我尝试执行插入函数时出现分段错误。

所以这里是(我认为)相关代码sn-ps:

/* node.h */
typedef struct {
   unsigned int elemSize;
   void *value;
   void *leftChild;    
   void *rightChild;   
   void (*freefn)(void *);     // free function
} Node;

void newNode(Node *node, unsigned int elemSize, void *value) {
    node->elemSize = elemSize;
    node->value = value;
    node->leftChild = NULL;
    node->rightChild = NULL;
}

void nodeSetValue(Node *node, void *value) {
    node->value = value;
}

void nodeSetLeftChild(Node *node, Node *leftChild) {
    node->leftChild = leftChild;
}

/* btree.h */
typedef struct {
    unsigned int elemSize;
    Node *root;                     
    void (*freefn)(void *);         // free function    
    int (*cmpfn)(void *, void *);   // compare function
} Btree;


void btreeInsertHelper(Node *node, void *value, int (*cmpfn)(void *, void *)) {
    if(node == NULL) {
        nodeSetValue(node, value);
        return;
    }
    int cmpresult = cmpfn(value, nodeGetValue(node));
    if(cmpresult >= 0) {
        Node *rightChild = nodeGetRightChild(node);
        if(rightChild == NULL) {
            rightChild = (Node *) malloc(sizeof(Node));
            nodeSetRightChild(node, rightChild);
        }
        btreeInsertHelper(rightChild, value, cmpfn);
    } else {
        Node *leftChild = nodeGetLeftChild(node);
        if(leftChild == NULL) {
            leftChild = (Node *) malloc(sizeof(Node));
            nodeSetLeftChild(node, leftChild);
        }
        btreeInsertHelper(leftChild, value, cmpfn);
    }
    return;
}

void btreeInsert(Btree *btree, void *value) {
    if(btree->root == NULL) {
        Node *root = (Node *) malloc(sizeof(Node));
        newNode(root, sizeof(btree->elemSize), value);
        btree->root = root;
        return;
     } else {
        btreeInsertHelper(btree->root, value, btree->cmpfn);
        return;
   }
}

/* test.c */
int intCmp(void *a, void *b) {
    return *(int *)a - *(int *)b;
}

int main() {

    Btree btree;
    newBtree(&btree, sizeof(int), NULL, intCmp);

    int a = 10;
    int b = 9;
    int c = 11;
    int d = 3;

    btreeInsert(&btree, &a);
    btreeInsert(&btree, &b);
    btreeInsert(&btree, &c);
    btreeInsert(&btree, &d);

    return 0;
}

我感觉我在某些时候传递了错误的引用

【问题讨论】:

  • 你知道分段错误发生在哪里吗?
  • newBtree() 定义在哪里?
  • 代码示例既不简单也不完整。 ;-)
  • 那么,您是否在调试器中单步执行了代码?
  • 发布 newBtree() 函数。

标签: c segmentation-fault binary-search-tree insertion


【解决方案1】:

我在工作中使用了一个简单的编辑器。 现在,在安装 IDE 并调试我的程序后,我发现在 btreeInsertHelper 函数的开头,“节点”从未变为 NULL。相反,我必须检查 node->value 是否为 NULL。在跳过 if 子句之后,比较函数将“值”与 NULL 值进行比较。

感谢您的帮助。为了完整起见,我的 newBtree 函数:

void newBtree(Btree *btree, unsigned int elemSize, void(freefn (void*),int(cmpfn)(void *,void *)) {
    btree->elemSize = elemSize;
    btree->freefn = freefn;
    btree->cmpfn = cmpfn;
    btree->root = NULL;
}

【讨论】:

    猜你喜欢
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多