2014-01-27 3 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() и она работает, как предполагалось, и я проверил его с помощью функции есть(), которая пересекает список и возвращает истину, если он находит узел с заданным значением, возвращается false в противном случае. Это первая прокомментированная строка в 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

Смежные вопросы