2016-02-29 95 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