【发布时间】:2016-02-28 21:13:51
【问题描述】:
我正在为我的程序开发一个销毁函数,但我在实现它时遇到了麻烦,因为我的结构混淆了我。我有两种结构:一种用于<key, value> 对,另一种用于数组、表大小和计数器。这是我所拥有的:
#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;
}
但由于许多原因,这不起作用。有人可以解释我如何才能释放这两种结构中的所有东西吗?语法让我很困惑。我需要(应该)免费柜台吗?我应该一次做一个结构,还是应该在数组中的每个索引处释放节点?谢谢大家。
【问题讨论】:
-
除非您显示分配发生的位置,否则我们所能做的就是猜测如何释放内存。我们是要假设为每个节点分配
key和value,还是value只是一个指针? -
p是指向SymTable_T的指针,它本身是struct SymTable *的typedef,所以你需要解引用它两次并且它没有next或key这样的成员.您确定这是您的确切代码吗? -
@DavidC.Rankin 是的,假设键和值都已分配。
-
SymTable_T是指针类型非常令人困惑,但Node_T不是。我强烈建议不要使用指针类型定义;而是将Symtable_T设为结构类型,并在需要指针时写入SymTable_T *。 -
您可能也应该发布您的创建代码,当我们看不到您分配的内容时,很难说应该释放什么。可以这样回答这个问题:每次拨打
malloc(并且地址相同)时,您必须拨打free一次
标签: c struct hashtable free destroy