Эта строка:
leaf = (struct node*) malloc( sizeof( struct node ) );
дает новое значение для leaf
, указывая его на недавно выделенную память. Однако новое значение не покидает функцию. Когда функция вернется, вызывающая сторона все еще будет ссылаться на старый leaf
, и произойдет утечка памяти.
Существует два подхода, чтобы исправить это:
1. Использовать указатель на указатель, например,
void insert(int key, struct node **leaf)
{
if(*leaf == 0 )
{
*leaf = (struct node*) malloc( sizeof( struct node ) );
...
}
/* In caller -- & is prepended to current_leaf. */
insert(37, ¤t_leaf);
2. Вернуть новый лист (или старый лист, если нет изменений).
struct node *insert(int key, struct node *leaf)
{
if(leaf == 0 )
{
leaf = (struct node*) malloc( sizeof( struct node ) );
...
}
return leaf;
}
/* In caller -- & is prepended to current_leaf. */
current_leaf = insert(37, current_leaf);
Указатели на указатели близки к тому, чтобы их было трудно понять. Возможно, я бы выбрал второй вариант, если insert
в настоящее время не возвращает ничего другого.