为什么对结构使用malloc时会出现分段错误11?

为什么对结构使用malloc时会出现分段错误11?,c,struct,segmentation-fault,malloc,C,Struct,Segmentation Fault,Malloc,我是C新手,通过MIT实用C编程开放课件()学习一些C基础知识 在作业5中,我们应该实现一个用于分配、释放、显示和遍历的小型二叉树库 在测试以下实现时 #include <stdlib.h> struct TreeNodeStruct { int data ; struct TreeNodeStruct *left, *right ; } ; typedef struct TreeNodeStruct TreeNode ; TreeNode* t

我是C新手,通过MIT实用C编程开放课件()学习一些C基础知识

在作业5中,我们应该实现一个用于分配、释放、显示和遍历的小型二叉树库

在测试以下实现时

#include <stdlib.h>

struct TreeNodeStruct {
        int data ;
        struct TreeNodeStruct *left, *right ;
} ;

typedef struct TreeNodeStruct TreeNode ;

TreeNode* talloc(int data)
{

    /* variables */

    TreeNode *p ;

    /* logic */

        p = malloc(sizeof(struct TreeNodeStruct)) ;
        p->data = data ;

    /* return */

    return p ;

}

TreeNode* addnode(TreeNode* root ,int data)
{

    /* logic */

        if(root == NULL) return talloc(data) ; // allocate node and return as new root
        else if(data < root->data) root->left = addnode(root->left, data) ;
        else root->right = addnode(root->right, data) ;

    /* return */

    return root ;

}
#包括
结构树析构函数{
int数据;
struct TreeNodeStruct*左、*右;
} ;
typedef struct TreeNode;
TreeNode*talloc(内部数据)
{
/*变数*/
TreeNode*p;
/*逻辑*/
p=malloc(sizeof(struct TreeNodeStruct));
p->data=数据;
/*返回*/
返回p;
}
TreeNode*addnode(TreeNode*root,int数据)
{
/*逻辑*/
if(root==NULL)返回talloc(data);//分配节点并作为新根返回
否则如果(数据data)root->left=addnode(root->left,数据);
else root->right=addnode(root->right,数据);
/*返回*/
返回根;
}
在一个非常简单的测试用例中

printf("\nProblem 5.2\n") ;

tree = talloc(0) ;

printf("talloc(0): %s\n", tree == NULL ? "failure" : "success") ;

for(int i1 = 0, i2 = 10; ++i1 < i2 ; ) addnode(tree, i1) ;
printf(“\n问题5.2\n”);
tree=talloc(0);
printf(“talloc(0):%s\n,tree==NULL?”失败:“success”);
对于(inti1=0,i2=10;++i1

我遇到了一个分段错误11。这是我的测试用例的产物还是我的实现中的错误?如果是,我做错了什么?

您没有在
talloc()中将
初始化为
NULL
addnode()
无法正确识别不存在的子树

您应该注意,
malloc()
不会初始化分配的内存空间中的任何内容。要将其自动初始化为
0
,应使用
calloc()


您没有在
talloc()
中将
left
right
初始化为
NULL
addnode()
无法正确识别不存在的子树

您应该注意,
malloc()
不会初始化分配的内存空间中的任何内容。要将其自动初始化为
0
,应使用
calloc()


talloc
中,需要将left和right设置为NULL


当您的代码在二叉树中迭代时,它将继续递归地调用自己,直到找到NULL,这表示您在“叶”上。但由于left和right包含垃圾,所以它不会找到NULL。

talloc
中,需要将left和right设置为NULL


当您的代码在二叉树中迭代时,它将继续递归地调用自己,直到找到NULL,这表示您在“叶”上。但是,由于左侧和右侧包含垃圾,因此它不会找到NULL。

malloc
不会初始化
结构的成员。添加代码来实现这一点

p = malloc(sizeof(struct TreeNodeStruct)) ;
p->data = data ;
p->left = NULL;
p->right = NULL;
如果不想使用这些行,也可以使用
calloc

p = calloc(1, sizeof(struct TreeNodeStruct)) ;
p->data = data ;

malloc
不会初始化
struct
的成员。添加代码来实现这一点

p = malloc(sizeof(struct TreeNodeStruct)) ;
p->data = data ;
p->left = NULL;
p->right = NULL;
如果不想使用这些行,也可以使用
calloc

p = calloc(1, sizeof(struct TreeNodeStruct)) ;
p->data = data ;

使用
calloc
而不是
malloc
。它将用零初始化节点的成员。并使用
sizeof*p
而不是
sizeof(struct TreeNodeStruct)
sizeof
是编译时的。好吧,简单的问题,简单的解决方案。谢谢你的快速回答!使用
calloc
而不是
malloc
。它将用零初始化节点的成员。并使用
sizeof*p
而不是
sizeof(struct TreeNodeStruct)
sizeof
是编译时的。好吧,简单的问题,简单的解决方案。谢谢你的快速回答!好的,我现在明白了<代码>左侧
右侧
未初始化。但是为什么它们没有初始化为
0
?或者,更重要的是,为什么它们指向“垃圾”@FK82,因为malloc除了尽可能快地分配一块内存之外什么也不做。它不会将分配的内存初始化为任何已知值。与calloc不同,calloc保证将分配的内存初始化为零<代码>左侧
右侧
未初始化。但是为什么它们没有初始化为
0
?或者,更重要的是,为什么它们指向“垃圾”@FK82,因为malloc除了尽可能快地分配一块内存之外什么也不做。它不会将分配的内存初始化为任何已知值。与calloc不同,calloc保证将分配的内存初始化为零。