2015-05-13 1 views
0
#include <stdio.h> 
#include <stdlib.h> 

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

struct nodeTree* insertRoot(struct nodeTree** root, int data) { 
    if(!(*root)) { 
     struct nodeTree *temp = malloc(sizeof(struct nodeTree)); 
     if(!temp) { 
      exit(-1); 
    } 

     temp->data = data; 
     temp->left = 0; 
     temp->right = 0; 
     (*root) = temp; 
     free(temp); 
     return *root; 
    } 
} 



int main() { 
    struct nodeTree *root = NULL; 
    root = insertRoot(&root,10); 
    printf("%d\n",root->data); 
    return 0; 
} 

Я написал функцию для вставки значения в корень двоичного дерева. В моей функции вставки я назначаю временный узел и после вставки значения в временный узел я назначаю временный узел root и освобождаю временный узел. Я понимаю, что могу напрямую malloc в корневую переменную и назначать ей данные. Что происходит, когда вызывается функция free (temp) и как она влияет на корневую переменную?Почему значение корня печатается как 0 в основной функции?

+0

'root-> data' имеет неопределенное поведение, так как' root' является недопустимым указателем (он указывает на освобожденную часть памяти). –

ответ

2

Вы не должны free()temp, потому что вы все еще указать на него с root, они указывают на те же данные, следовательно, освободив temp делает свободный *root тоже.

Как почему это печать 0 это просто совпадение, потому что наличие free() ред root в функции, где вы выделили, и доступ к нему в main() вызывает неопределенное поведение, следствием может быть то, что printf() принты, 0, который является поведение, и поскольку оно не определено, любое другое поведение действительно возможно.

+0

Непонятно, что я читал везде, что независимо от того, что вы malloc должны быть свободными() ed. Используя ту же самую временную переменную, какой был бы правильный способ писать код? – EnthusiatForProgramming

+0

@ user1534214 Конечно, вам нужно бесплатно освободить память malloc. Но только когда вам это больше не нужно. Очевидно, что в этом случае вам по-прежнему нужна эта память, поэтому вы не должны ее освобождать. Как правило, вы освобождаете память, когда этот узел должен быть удален/удален из дерева. – kaylum

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