2014-01-27 91 views
1

我正在創建一個二進制樹作爲小項目來學習C.這裏是您需要的所有代碼。現在C初始化總線錯誤

typedef struct { 
    int value; 
    struct Node *leftchild; 
    struct Node *rightchild; 
    struct Node *parent; 
} Node; 

typedef struct { 
    Node *root; 
} BinaryTree; 

void newBT(BinaryTree *_bt) { 
    _bt->root = 0; 
    return; 
}; 

Node* makeNode(int _value) { 
    Node *node; 
    node->value = _value; 
    node->leftchild = 0; 
    node->rightchild = 0; 
    node->parent = 0; 
    return node; 
}; 

void insert(BinaryTree* _bt, int _value) { 
    _bt->root = makeNode(_value); 
    return; 
}; 

,我過我的makeNode()函數,它按預期工作,我用它遍歷該列表,如果發現某個節點與給定值返回true的有()函數,返回檢查它否則爲假。它是下面main()中的第一條註釋行。當我將我的BinaryTree傳遞到insert()並使用指針聲明同一行時,我得到一個總線錯誤:10。

int main() { 
    BinaryTree bt; 
    newBT(&bt); 
    //bt.root = makeNode(14); 
    insert(&bt, 14); 
    //printf("%d \n", has(&bt, 14)); 
    return 0; 
} 

有什麼建議嗎?

回答

3

makeNode正在寫入由未初始化指針指向的(未定義)地址。你不擁有這個指向的內存,所以試圖寫入它會導致未定義的行爲;崩潰是未定義行爲的有效(並且通常是有用的)示例。

這裏需要

Node* makeNode(int _value) { 
    Node *node = malloc(sizeof(*node)); 
    if (node == NULL) { 
     return NULL; 
    } 
    ... 

分配內存確保將此內存返回系統 - 通過調用free(node) - 當您從列表中刪除一個節點。

+0

任何東西都是未定義行爲的有效示例:)(格式化硬盤,莎士比亞版畫,打開烤麪包機)。我認爲你的意思是'常見的例子' – pm100