2016-02-29 85 views
1

我正在C(Linux Debian,gcc版本4.9.2)中使用二叉树,我在释放由malloc分配的内存时遇到了一些麻烦。第一个deltree()工作正常,但第二个deltree()给我一个分段错误。可能是什么原因?当释放二叉树递归时出现分段错误

#include <stdio.h> 
#include <stdlib.h> 

/* 
    compiling with flags -ansi -Wstrict-prototypes 
*/ 

struct treenode{ 
    struct treenode *left; 
    struct treenode *right; 
    int data; 
}; 

typedef struct treenode node; 

void deltree(node *tree); 

int main(void){ 
    node *root; 

    printf("First tree\n"); 
    printf("===================\n"); 

    root=(node *)malloc(sizeof(node)); 
    root->data=5; 

    root->left=(node *)malloc(sizeof(node)); 
    root->left->data=4; 

    root->right=(node *)malloc(sizeof(node)); 
    root->right->data=6; 

    printf("Root node has data %d\n",root->data); 
    printf("Left child has data %d\n",root->left->data); 
    printf("Right child has data %d\n",root->right->data); 

    deltree(root); /* NO PROBLEM HERE */ 

    printf("Second tree\n"); 
    printf("===================\n"); 

    root=(node *)malloc(sizeof(node)); 
    root->data=-7; 

    root->left=(node *)malloc(sizeof(node)); 
    root->left->data=-5; 

    root->right=(node *)malloc(sizeof(node)); 
    root->right->data=-1; 

    printf("Root node has data %d\n",root->data); 
    printf("Left child has data %d\n",root->left->data); 
    printf("Right child has data %d\n",root->right->data); 

    deltree(root); /* SEGMENTATION FAULT HERE */ 

    printf("Finished\n"); 

    return(EXIT_SUCCESS); 
} 

void deltree(node *tree){ 
    if(tree!=NULL){ 
    deltree(tree->left); 
    deltree(tree->right); 

    printf(".\n"); 

    free(tree); 
    } 
} 
+0

另:除了root =(node *)malloc(sizeof(node));',建议'root = malloc(sizeof * root);'更容易编码/维护,代码错误的可能性更小。 – chux

回答

3

你不那么他们的价值是不确定的分配后初始化leftright指针。可以使用calloc或手动设置指针NULL

+0

谢谢。当然,我忘了将叶节点设置为NULL。 – Accumulator