【问题标题】:Why Do I get a segmentation fault 11 using malloc for a struct?为什么我使用 malloc 作为结构会出现分段错误 11?
【发布时间】:2015-03-19 15:36:10
【问题描述】:

我是 C 新手,我自己通过 MIT 开放课件进行实用 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 错误。这是我的测试用例的人工制品还是我的实现中的错误?如果是,我做错了什么?

【问题讨论】:

  • 使用calloc 而不是malloc。它将用零初始化节点的成员。并使用sizeof *p 而不是sizeof(struct TreeNodeStruct)sizeof 是编译时。
  • 好的,简单的问题,简单的解决方案。感谢您的快速回答!

标签: c struct segmentation-fault malloc


【解决方案1】:

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 ;

【讨论】:

    【解决方案2】:

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

    当您的代码遍历二叉树时,它将继续递归调用自身,直到找到 NULL,这表明您在“叶子”上。但是因为left和right都包含垃圾,所以找不到NULL。

    【讨论】:

    • 好的,我现在明白了。 leftright 未初始化。为什么他们不初始化为0?或者,更重要的是,他们为什么指向“垃圾”?
    • @FK82 因为 malloc 只是尽可能快地分配一块内存。它不会将分配的内存初始化为任何已知值。与 calloc 不同,它保证将分配的内存初始化为零。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-27
      • 2018-01-07
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      相关资源
      最近更新 更多