2011-12-17 2 views
1
typedef struct nodetype 
{ 
int data; 
struct nodetype * left; 
struct nodetype * right; 
}node; 

typedef node * tree; 

tree newNode(int data) 
{ 
tree temp; 
temp = NULL; 
temp = (tree)malloc(sizeof(nodetype)); 
temp->data = data; 
temp->right = NULL; 
temp->left = NULL; 
return temp; 
} 

Здесь, в функции newNode, для создания узла мы назначаем значение NULL для «temp». Я не понимаю, нужно ли это. Каковы будут последствия, если мы не инициализируем его с помощью NULL, и в каких случаях я должен позаботиться о назначении ptr NULL при инициализации?Инициализация указателя: когда назначить NULL инициализированному указателю?

+0

Это не инициализация. Инициализация - это когда вы указываете значение в том же самом заявлении, которое объявляет значение, например. 'tree temp = NULL;'. –

ответ

1

Вы инициализируете узлы в NULL, чтобы вы могли различать пустые узлы от тех, которые не являются (путем проверки NULL). В противном случае у вас не будет возможности указать, пуст ли узел. Это говорит о левом и правом узлах. Нет очевидной причины, по которой temp инициируется в NULL, вы можете удалить это.

Вы назначаете указатель на NULL, если вы не знаете, будете ли вы использовать его, чтобы указать на что-то, и у вас будет код, который проверяет, присвоено ли ему NULL или нет, поэтому он может выполнять некоторую логику (например, перемещение по дереву).

2

temp = NULL в коде выше не требуется, поскольку это значение немедленно перезаписывается. Ваш компилятор, вероятно, устранит избыточный код на этапе оптимизации. Просто удалите эту строку кода.

3

Это совершенно не нужно, так как он немедленно перезаписывается malloc(), который установит его на ... NULL при сбое распределения, что означает, что код глючит!

Там должно быть:

if (!temp) 
    return temp; 

сразу после malloc().

1

Я подозреваю, что назначение NULL связано с тем, что у программиста была строгая политика всегда назначать его или ее переменные. Неплохая политика, хотя здесь это не обязательно.

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