Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 分段故障二叉树_C_Pointers - Fatal编程技术网

C 分段故障二叉树

C 分段故障二叉树,c,pointers,C,Pointers,我试图学习一些C语言,我从实现一个二叉树开始 我要做的第一件事就是插入到树中。然而,我遇到了一个分割错误,我不知道为什么 当我尝试将*tree参数设置为具有传入值的新节点时,会发生分段错误。我试着先使用free(*tree),但这并没有真正的帮助 据我所知,我有一个指向树指针的指针。所以我应该更新被指向的指针(如果这有意义的话?)createNode(val)返回指向节点的指针。所以我想我可以简单地用那个指针代替“指针对象”。所以我有一个指向新指针的指针,它最初是NULL 我知道我不知道指针在这

我试图学习一些C语言,我从实现一个二叉树开始

我要做的第一件事就是插入到树中。然而,我遇到了一个分割错误,我不知道为什么

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

据我所知,我有一个指向树指针的指针。所以我应该更新被指向的指针(如果这有意义的话?)
createNode(val)
返回指向节点的指针。所以我想我可以简单地用那个指针代替“指针对象”。所以我有一个指向新指针的指针,它最初是
NULL

我知道我不知道指针在这一点上是如何工作的,但这就是我为什么要尝试的原因。。 #包括 #包括 #包括

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();

}
typedef结构节点{
int-val;
结构节点*左;
结构节点*右;
}节点;
节点*createNode(int val)
{
node*n=malloc(sizeof(node));
n->val=val;
n->left=NULL;
n->right=NULL;
返回n;
}
节点*createTree()
{
node*root=malloc(sizeof(node));
根->val=12;
根->左=创建节点(10);
根->右=创建节点(14);
根->左->左=创建节点(8);
根->左->右=创建节点(9);
根->右->左=创建节点(13);
根->右->右=创建节点(16);
返回根;
}
void insertentree(节点**树,int val)
{
printf(“%i\n”,(*tree)->val);
if((*tree)==NULL)
{
自由(*树);
*tree=createNode(val);
}
其他的
{
如果((*树)->val>val)
{
insertentree(&(*tree)->左,val);
}
其他的
{
如果((*树)->val右,val);
}
}
}   
}
main()
{
node*tree=createTree();
插入树(&tree,5);
getchar();
}
insertInTree()中

在访问最后一个节点(
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);
david@debian:~$gdb演示
GNU gdb(gdb)7.4.1-debian
版权所有(C)2012免费软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本
这是自由软件:您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。键入“显示复制”
和“显示保修”了解详细信息。
此GDB配置为“x86_64-linux-gnu”。
有关错误报告说明,请参阅:
...
从/home/david/demo读取符号…完成。
(gdb)运行
启动程序:/home/david/demo
12
10
8.
程序接收信号SIGSEGV,分段故障。
演示c:36处insertInTree中的0x00000000004006ea(树=0x601078,val=5)
36 printf(“%i\n”,(*tree)->val);
insertInTree()中

在访问最后一个节点(
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);
david@debian:~$gdb演示
GNU gdb(gdb)7.4.1-debian
版权所有(C)2012免费软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本
这是自由软件:您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。键入“显示复制”
和“显示保修”了解详细信息。
此GDB配置为“x86_64-linux-gnu”。
有关错误报告说明,请参阅:
...
从/home/david/demo读取符号…完成。
(gdb)运行
启动程序:/home/david/demo
12
10
8.
程序接收信号SIGSEGV,分段故障。
演示c:36处insertInTree中的0x00000000004006ea(树=0x601078,val=5)
36 printf(“%i\n”,(*tree)->val);

root->left->left=createNode(8);根->左->右=创建节点(9)树的结构不正确。如果节点为NULL(
if(*tree)==NULL){free(*tree),为什么要显式调用
free
?没有任何意义
free
ing
NULL
s是合法的,但它没有任何效果。@dasblinkenlight:我知道,但如果它是NULL指针,那么
free
调用就没有意义。如果它没有优化掉,它所做的就是添加无意义的函数调用,这是我后来尝试的。我认为它是无意义的:)
root->left->left=createNode(8);root->left->right=createNode(9);
树的结构不正确。如果节点为NULL(
if((*tree)==NULL){free(*tree),为什么要显式调用
free
?没有任何意义
free
ing
NULL
s是合法的,但它没有任何效果。@dasblinkenlight:我知道,但如果它是NULL指针,那么
free
调用就没有意义。如果它没有优化掉,它所做的就是添加无意义的函数调用,这是我后来尝试的。我认为它是无意义的:)