C - 带 2 个结构的销毁函数

标签 c struct hashtable free destroy

我正在为我的程序开发一个销毁函数,但我在实现它时遇到了麻烦,因为我的结构混淆了我。我有两个结构:1 个用于 <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;
}

但是由于很多原因这并不奏效。有人可以解释我如何才能释放这两个结构中的所有内容吗?语法让我很困惑。我需要(应该)免费柜台吗?我应该一次做一个结构还是应该在数组中的每个索引处释放节点?谢谢大家。

最佳答案

在不查看内存分配方式的情况下,很难准确确定您尝试释放的内存布局。根据您的评论,您正在为 symTable 数组(元素初始化 NULL)分配内存,一些指向 struct Node 的指针(Table),它们被初始化为 NULL,并且从中分配节点列表,并为 keyvalue 分配单独的分配。您持有 起始地址Table 中的节点列表。

假设 symTablestruct SymTable 的分配数组,并且为 struct Node 类型的每个节点分配内存 在指向类型 Node_t(struct Node)的指针中,为 symTable 中的每个元素命名为 Table >,并且 keyvalue 都已分配,您可以尝试在 的每个元素中释放与每个列表 Table 关联的内存symTable 类似:

void symTable_destroy (SymTable_T *symTable)
{
    for (i = 0; i < DEFAULT_TABLE_SIZE && symTable[i]; i++)
    {
        struct Node *p = *(symTable[i]->Table); /* pointer to node  */
        while (p != NULL)               /* for each allocated node  */
        {
            struct Node *victim = p;    /* pointer node to delete   */
            free (victim->key);         /* free key for node        */
            free (victim->value);       /* free value for node      */
            p = p->nextp;               /* set p to next node       */
            free (victim);              /* free node memory         */
        }
        free (symTable[i]->Table);      /* free Table memory        */
    }
    free (symTable);     /* free allocated array of struct SymTable */
}

上面的指针victim指向当前要删除的节点,允许p保存nextp的地址,并在当前删除后保持有效节点被删除。试一试,如果您有问题,请告诉我。如果您有任何问题,请编辑您的问题并发布显示分配的完整代码,我很乐意与您进一步合作。

关于C - 带 2 个结构的销毁函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33927377/

相关文章:

c - 请帮我编译这个C程序? [Linux]

c - 用数组填充数组?

C:当我将一个数组复制到另一个数组时,代码停止工作

Powershell:从同一对象中引用另一个对象属性中的对象属性?

c++ - 如何实现具有 2 个键的哈希表?

c - gcc 的 __builtin_cpu_supports 检查操作系统支持吗?

matlab - 从结构的多个字段中提取行

struct - cgo 从 Go : underscore or no underscore? 访问 C 结构字段

json - 编码类型时如何将方法结果嵌入到 JSON 输出中?

python - 从字符串或列表创建字典