Я работаю над функцией destroy для своей программы, но у меня проблемы с ее реализацией, потому что мои структуры смешивают меня. У меня две структуры: 1 для пар <key, value>
и другая для массива, размера стола и счетчика. Вот что у меня есть:C - Функция разрушения w/2 структуры
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <assert.h>
#include "symTable.h"
#define DEFAULT_TABLE_SIZE 61
#define HASH_MULTIPLIER 65599
typedef struct Node
{
char *key;
int *value;
struct Node *next;
} Node_T;
typedef struct SymTable
{
Node_T **Table;
int tablesize;
int counter;
} *SymTable_T;
SymTable_T SymTable_create(void)
{
SymTable_T S_Table;
S_Table = malloc(sizeof(SymTable_T *) * DEFAULT_TABLE_SIZE);
S_Table->Table = (Node_T **) calloc(DEFAULT_TABLE_SIZE, sizeof(Node_T *));
return S_Table;
}
void symTable_destroy(SymTable_T symTable)
{
SymTable_T *p, *nextp;
int i;
assert(symTable != NULL);
for (i = 0; i < DEFAULT_TABLE_SIZE; i++)
{
for (p = symTable[i]; p != NULL; p = nextp)
{
nextp = p->next;
assert(p->key != NULL);
free(p->key);
free(p);
}
}
free(symTable);
return;
}
но это не работает по многим причинам. Может кто-нибудь объяснить, как я могу освободить все в обеих структурах? Синтаксис меня очень смущает. Нужно ли мне (если я) бесплатный счетчик? Должен ли я делать одну структуру за раз или я должен освобождать узел, когда я нахожусь в каждом индексе в массиве? Спасибо, парни.
Если вы не показываете, где находятся ваши распределения, то все, что мы можем сделать, это угадать, как освободить память. Предположим ли мы, что для каждого узла выделяются как «ключ», так и «значение», или «значение» просто указатель? –
'p' является указателем на' SymTable_T', который сам является typedef для 'struct SymTable *', поэтому вам нужно разыменовать его дважды, и у него нет таких членов, как 'next' или' key'. Вы уверены, что это ваш точный код? – mch
@ DavidC.Rankin Да, предполагается, что ключ и значение уже выделены. –