C语言 正确从链表中删除元素?指针的内存错误



我正在实现一个具有remove_entry函数和clear_table函数的哈希表。现在我收到与remove_entry函数有关的内存读取错误。帮助将不胜感激

这些是我的结构:

typedef struct bucket {
   char *key;
   void *value;
   struct bucket *next;
} Bucket;
typedef struct {
   int key_count;
   int table_size;
   void (*free_value)(void *);
   Bucket **buckets;
} Table;

这是我的函数:

int remove_entry(Table * table, const char *key){
    unsigned int hc = 0;
    Bucket *curr_b;
    Bucket *next_b;
    if(table == NULL || key == NULL){
        return FAIL;
    } else {
        hc = hash_code(key)%(table->table_size);
        if(table->buckets[hc] != NULL){
            curr_b = table->buckets[hc];
            /*Check the buckets in linked list*/
            while(curr_b != NULL){
                next_b = curr_b->next;
                if(strcmp(curr_b->key,key) == 0){
                    free(curr_b->key);
                    if(table->free_value != NULL){
                        table->free_value(curr_b->value);
                    }
                    free(curr_b);
                    curr_b = NULL;
                    table->key_count--;
                    return SUCC;
                } else {
                    curr_b = next_b;
                }
            }
            return FAIL;
        }
        return FAIL;
    }
}

删除条目并尝试读取表后,内存泄漏。我不认为我删除了正确的东西。

内存错误:

不知道如何从终端复制/粘贴,所以他们都说这样的话

Invalid read of size __
Address ____ is __ bytes inside a block of size ___ free'd

您需要考虑table->buckets[hc]是您释放的存储桶的情况。

free(curr_b->key);之前添加:

if(curr_b == table->buckets[hc]) {
    table->buckets[hc] = next_b;
}

就像现在一样,您释放了一个存储桶,但table->buckets[hc]仍然指向它。所以下次你读它的时候,你是在读释放的记忆。因此错误。

此外,您需要跟踪上一个存储桶

,以便在删除存储桶时可以将上一个存储桶指向下一个存储桶。

相关内容

  • 没有找到相关文章

最新更新