typedef struct _TRANSITION TRANSITION;
typedef struct {
char name[4];
bool is_initial;
bool is_final;
TRANSITION *transitions;
int number_transitions;
} STATE;
struct _TRANSITION {
char c;
STATE *dest;
};
void destroy_state(STATE **pp_state) {
if (pp_state != NULL && *pp_state != NULL) {
free((*pp_state)->transitions);
(*pp_state)->transitions = NULL;
}
free(*pp_state);
*pp_state = NULL;
}
Что я хочу сделать, это удалить STATE
. Поэтому мне нужно освободить все мое состояние TRANSITION
. Здесь вы можете увидеть функции, которые создают эти структуры:Освобождение памяти от массива структурных переменных
STATE *create_state(char *name, bool is_initial, bool is_final) {
STATE *state = (STATE *) malloc(sizeof(STATE));
if (state != NULL) {
strcpy(state->name, name);
state->is_initial = is_initial;
state->is_final = is_final;
state->transitions = NULL;
state->number_transitions = 0;
}
return state;
}
void add_transition(STATE *source, char sign, STATE *dest) {
if (source != NULL && dest != NULL) {
TRANSITION *transitions = source->transitions;
TRANSITION *trans = source->transitions;
int i;
if (transitions != NULL) {
transitions = (TRANSITION *) realloc(transitions, sizeof(TRANSITION) * ((source->number_transitions) + 1));
} else {
transitions = (TRANSITION *) malloc(sizeof(TRANSITION));
}
trans = (transitions + source->number_transitions);
trans->c = sign;
trans->dest = dest;
(source->number_transitions)++;
source->transitions = transitions;
}
}
Однако, как я проверил свою функцию в главном методе с этим:
STATE *first = create_state("S'0", true, false);
STATE *second = create_state("S'1", false, false);
printf("%s: Initial: %d, Final: %d\n", first->name, first->is_initial, first->is_final);
add_transition(first, 'A', second);
add_transition(first, 'B', second);
add_transition(first, 'C', second);
TRANSITION *transition = first->transitions;
printf("%c", transition[0].c); // Output: A
printf("%c", transition[1].c); // Output: B
printf("%c\n", transition[2].c); // Output: C
destroy_state(&first);
printf("%c", transition[0].c); // Output:
printf("%c", transition[1].c); // Output: B
printf("%c", transition[2].c); // Output: C
Похоже, что я просто удален первым TRANSITION
(Результат прокомментировал функции printf()
).
Очевидно, что я сделал что-то неправильно. Мое первое решение этой проблемы состояло в том, что я должен перебирать переходы. Но так как я просто выделяю пространство для одного массива TRANSITION
, я не вижу, что это работает (и, как я и ожидал, это не сработало).
В чем моя ошибка?
Не связанные с вашей проблемой, но имена символов, начинающиеся с символа подчеркивания, за которым следует заглавная буква, зарезервированы для «реализации» (т. Е. Для компилятора и стандартной библиотеки). –
И имена всех прописных букв должны использоваться только для enum-констант и макросов. – Olaf