Я пишу простой синтаксический анализатор на C, и я не уверен, что это лучший способ передать результаты в мое дерево, когда оно оценивается.
Вот мой текущий код, структура узла и функция ходьбы для оценки дерева.
typedef struct node {
struct node* left;
struct node* right;
void* data;
Symbol type;
} node;
void* walk(node* n) {
if (n != NULL) {
if (n->type == plus) {
int x = 0;
int a = *(int*)walk(n->left);
int b = *(int*)walk(n->right);
x = a + b;
return &x;
} else if (n->type == number) {
return (int*)n->data;
}
}
return NULL;
}
Из кода, который вы можете видеть, когда я добавляю два числа вместе, я сохраняю результат в локальной переменной и возвращаю адрес этой переменной, я знаю, что это неопределенное поведение, поэтому я подумал об использовании malloc и изменении своего кода на это:
int* x = malloc(1 * sizeof(int));
int a = *(int*)walk(n->left);
int b = *(int*)walk(n->right);
*x = a + b;
return x;
Но проблема с этим кодом в том, что я не уверен, каков наилучший способ освободить эту память, которую я только что использовал malloc.
Должен ли я пройти по дереву второй раз и освободить всю память таким образом, или это лучший способ освободить память, когда я закончу, или есть лучший способ распространения значений через мое дерево?