为什么我使用malloc作为结构来获得分段错误11?

时间:2015-03-19 15:36:10

标签: c struct segmentation-fault malloc

我是C的新手,通过麻省理工学院开放课件进行实用的C编程(MIT OCW Homepage),以学习一些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 ;

}

在一个非常简单的测试用例中

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

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

3 个答案:

答案 0 :(得分:2)

您未在left中初始化rightNULLtalloc()addnode()无法正确识别不存在的子树。

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

p = calloc(1, sizeof(TreeNode));

答案 1 :(得分:2)

talloc中,您需要将left and right设置为NULL。

当你的代码遍历二叉树时,它将继续递归地调用自身,直到它找到NULL,这表明你正在&#34; leaf&#34;。但由于左右包含垃圾,因此无法找到NULL。

答案 2 :(得分:2)

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 ;