繁体   English   中英

分割故障二叉树

[英]Segmentation fault Binary Tree

我试图学习一些C语言,我首先实现了一个二叉树。

我要尝试的第一件事是插入树中。 但是,我遇到了细分错误,无法弄清原因。

当我尝试将*tree参数设置为带有传入值的新节点时,会发生分段错误。 我先尝试使用free(*tree)但这并没有帮助。

据我了解,我有一个指向我树的指针的指针。 因此,我应该更新所指向的指针(如果这有意义吗?)。 createNode(val)返回指向节点的指针。 因此,我认为我可以简单地将该指针替换为“ pointee”。 所以我有一个指向新指针的指针,该指针最初是NULL

我知道我现在还无法真正了解指针的实际工作原理,但这就是我要尝试的原因。.#include #include #include

typedef struct node {
    int val;
    struct node * left;
    struct node * right;
}node;

node * createNode(int val)
{
    node * n = malloc(sizeof(node));
    n->val = val;
    n->left = NULL;
    n->right = NULL;

    return n;
}
node * createTree()
{
    node * root = malloc(sizeof(node));
    root->val = 12;
    root->left = createNode(10);
    root->right = createNode(14);

    root->left->left = createNode(8);
    root->left->right = createNode(9);

    root->right->left = createNode(13);
    root->right->right = createNode(16);

    return root;
}
void insertInTree(node ** tree, int val)
{
    printf("%i\n", (*tree)->val);

    if((*tree) == NULL)
    {
        free(*tree);
        *tree = createNode(val);
    }
    else
    {
        if((*tree)->val > val)
        {
            insertInTree(&(*tree)->left, val);
        }
        else
        {
            if((*tree)->val < val)
            {
                insertInTree(&(*tree)->right, val);
            }
        }
    }   
}

main()
{
   node * tree = createTree();
   insertInTree(&tree, 5);
   getchar();

}

insertInTree()

printf("%i\n", (*tree)->val);

您在访问最后一个节点( NULL )后得到SEGFAULT

调试器将告诉您:

david@debian:~$ gdb demo
GNU gdb (GDB) 7.4.1-debian
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/david/demo...done.
(gdb) run
Starting program: /home/david/demo 
12
10
8

Program received signal SIGSEGV, Segmentation fault.
0x00000000004006ea in insertInTree (tree=0x601078, val=5) at demo.c:36
36      printf("%i\n", (*tree)->val);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM