2017-06-01 48 views
-3

我一直在學習數據結構與算法C和chaning一個結構的元素Ç - Changint一個結構的元素的順序導致分段故障

這裏的訂單時,我只是有一個問題我lib.h文件:

typedef struct ElementType 
    { 
     int id; 
     char name[20]; 
    } ElementType; 


    typedef struct Node 
    { 
     ElementType data; 

     struct Node* left; 
     struct Node* right; 
    } Node; 


    Node* insert(Node** tree, ElementType e) 
    { 
     if((*tree) == NULL) 
     { 
      (*tree)=(Node*)malloc(sizeof(Node)); 

      (*tree)->data = e; 

      (*tree)->left = NULL; 
      (*tree)->right = NULL; 

      return (*tree); 
     } 

     else if ((*tree)->data.id == e.id) 
      return (*tree); 

     else if (e.id < (*tree)->data.id) 
      return insert(&((*tree)->left), e); 

     else 
      return insert(&((*tree)->right), e); 
    } 

    void freeTree(Node* tree) 
    { 

     if((tree) == NULL) 
      return; 

     else 
     { 
      freeTree(tree->left); 
      freeTree(tree->right); 

      free(tree); 
     } 
    } 

    void inorder(Node* tree) 
    { 
     if(tree!=NULL) 
     { 
      inorder(tree->left); 

      printf("%d - %s\n", tree->data.id, tree->data.name); 
      printf("This node : %p\n", tree); 
      printf("This data : %p\n", &(tree->data)); 
      printf("This left : %p\n", tree->left); 
      printf("This right : %p\n", tree->right); 

      inorder(tree->right); 
     } 
    } 


    void init(Node** tree) 
    { 
     (*tree) = NULL; 
    } 

這是我的主文件中包含上述的lib

ElementType makeNewElem(int a, char* b) 
{ 
    ElementType e; 
    e.id = a; 
    strcpy(e.name, b); 

    return e; 
} 

int main() { 

    Node* root; 

    init(&root); 
    ElementType a = makeNewElem(5, "A"); 
    ElementType b = makeNewElem(6, "B"); 
    ElementType c = makeNewElem(7, "C"); 

    insert(&root, a); 
    insert(&root, b); 
    insert(&root, c); 

    inorder(root); 
    printf("\n"); 
    freeTree(root); 
    inorder(root); 
    return 0; 
} 

這是我編譯後的結果

5 - A 
This node : 0x1671010 
This data : 0x1671010 
This left : (nil) 
This right : 0x1671040 
6 - B 
This node : 0x1671040 
This data : 0x1671040 
This left : (nil) 
This right : 0x1671070 
7 - C 
This node : 0x1671070 
This data : 0x1671070 
This left : (nil) 
This right : (nil) 

23531568 - 
This node : 0x1671010 
This data : 0x1671010 
This left : (nil) 
This right : 0x1671040 
23531616 - 
This node : 0x1671040 
This data : 0x1671040 
This left : (nil) 
This right : 0x1671070 
0 - 
This node : 0x1671070 
This data : 0x1671070 
This left : (nil) 
This right : (nil) 

然後我後移動線 「的ElementType數據;」

typedef struct Node 
{ 
    struct Node* left; 
    struct Node* right; 

    ElementType data; 
} Node; 

控制檯>>

5 - A 
This node : 0x1226010 
This data : 0x1226020 
This left : (nil) 
This right : 0x1226040 
6 - B 
This node : 0x1226040 
This data : 0x1226050 
This left : (nil) 
This right : 0x1226070 
7 - C 
This node : 0x1226070 
This data : 0x1226080 
This left : (nil) 
This right : (nil) 

Segmentation fault (core dumped) 

有人能幫助我解釋爲什麼 之前1.我改變了代碼,爲什麼它仍然打印出數據的價值(我雖然該節點將是NULL在被釋放後!?) 2.我更改了代碼之後,爲什麼我的核心轉儲?

我爲我長的問題,我的英語不好所以對不起!

+0

[請參閱此討論,爲什麼不在C中拋出malloc()和family的返回值..](https://stackoverflow.com/q/605845/2173917) –

+3

未定義的行爲未定義。 – melpomene

+3

更改結構成員的順序應該對正確的程序沒有影響。如果它導致錯誤,那麼程序中的某處可能有未定義的行爲。使用調試器來瀏覽程序,以查看事情何時出錯。 – Barmar

回答

0
... 
freeTree(root); 
inorder(root); 
... 

你在這裏期待什麼?這會導致一個未定義的行爲:有時可能會起作用,有時可能不起作用。

刪除freeTree聲明,它會正常工作。