Ну, одна проблема - вы не типизируете указатель.
Линия:
b=malloc(sizeof(b));
Должно быть:
b=(bst*)malloc(sizeof(b));
Ваш код выдает ошибку при компиляции в gcc.
Это способ выявления и исправления ошибок в будущем:
Тестирование в GDB :
Полный код:
#include <malloc.h>
#include <stdio.h>
typedef struct node
{
struct node *leftChild, *rightChild;
int value;
} bst;
void insert(bst* b, int i)
{
b=(bst*)malloc(sizeof(b));
b->value=i;
b->leftChild = NULL;
b->rightChild = NULL;
printf("[%i]",b->value);
return;
}
main()
{
bst* b;
insert(b,5);
printf("[%i]",b->value);
}
Скомпилировано с
% g ++ -g main.cc
Побежал с
% gdb a.out
Команды GDB:
b main.cc:211
run
print b
(output is: 0x0)
step
step
print b
(output is: 0x4f60010)
step
step
step
step
step
print b
(output is: 0x0)
quit
Это ясно указывает на то, что ваша переменная освобождается, когда функция выходит из области видимости.
Изменение кода на:
#include <malloc.h>
#include <stdio.h>
typedef struct node
{
struct node *leftChild, *rightChild;
int value;
} bst;
void insert(bst* b, int i)
{
b->value=i;
b->leftChild = NULL;
b->rightChild = NULL;
printf("[%i]",b->value);
return;
}
main()
{
bst* b;
b=(bst*)malloc(sizeof(bst));
insert(b,5);
printf("[%i]",b->value);
free(b);
}
и перезапуск GDB с помощью следующих команд:
b main.cc:21
run
s
(short for step)
print b
(output: 0x1aab010)
s
s
s
s
s
s
print b
(output: 0x1aab010)
Ваша проблема явно в объеме распределения. Перемещение выделения в основные исправления.
Yay ваша программа теперь работает!
Это должно дать вам представление о том, как использовать отладчик для решения подобных простых ошибок в будущем.
Редактировать
Как отметил один из операторов, ваша основная проблема заключается в том, что указатели, передаваемые функциям в c, рассматриваются как локальные объекты, поэтому при выходе из функции любая выделенная память для отдельных указателей отбрасывается в битовую корзину.
Двойные указатели позволяют вам фактически размещать внутри функций, вы просто должны быть осторожны и разыменовывать их по мере необходимости. Таким образом, ваш рабочий код также может быть:
#include <malloc.h>
#include <stdio.h>
typedef struct node
{
struct node *leftChild, *rightChild;
int value;
} bst;
void insert(bst** b, int i)
{
(*b)=(bst*)malloc(sizeof(bst));
(*b)->value=i;
(*b)->leftChild = NULL;
(*b)->rightChild = NULL;
printf("[%i]",(*b)->value);
return;
}
main()
{
bst* b;
insert(&b,5);
printf("[%i]",b->value);
free(b);
}