首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么对结构使用malloc来获得分段错误11?

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

Stack Overflow用户
提问于 2015-03-19 15:36:10
回答 3查看 322关注 0票数 1

我是C的新手,为了学习一些C基础知识,我自己开发了麻省理工学院实用C编程(麻省理工学院开放式课程主页)开放课件。

在赋值5中,我们应该实现一个小的二叉树库,用于分配、去分配、显示和遍历。

在测试以下实现时

代码语言:javascript
复制
#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 ;

}

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

代码语言:javascript
复制
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错误。这是测试用例的伪像还是实现中的错误?如果是,我做错什么了?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-19 15:40:43

malloc不初始化struct的成员。添加代码来完成这一任务。

代码语言:javascript
复制
p = malloc(sizeof(struct TreeNodeStruct)) ;
p->data = data ;
p->left = NULL;
p->right = NULL;

如果不想使用这些行,也可以使用calloc

代码语言:javascript
复制
p = calloc(1, sizeof(struct TreeNodeStruct)) ;
p->data = data ;
票数 2
EN

Stack Overflow用户

发布于 2015-03-19 15:39:51

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

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

代码语言:javascript
复制
p = calloc(1, sizeof(TreeNode));
票数 2
EN

Stack Overflow用户

发布于 2015-03-19 15:40:01

talloc中,您需要将左和右设置为空。

当您的代码遍历二叉树时,它将继续递归地调用自己,直到找到NULL为止,这表明您处于“叶子”状态。但是由于左和右都包含垃圾,所以它不会找到NULL。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29148851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档