gpt4 book ai didi

c - 释放 C 语言中的 HashMap 桶数组

转载 作者:行者123 更新时间:2023-12-04 05:36:34 25 4
gpt4 key购买 nike

我已经在 C 中实现了一个哈希图,经过相当多的工作,我让一切都运行良好……除了我的发布程序。

我的结构设置如下:

struct hashmap_element {
int value;
int key;
int used;
struct hashmap_element* next;
};
struct hashmap {
int table_size;
int current_size;
struct hashmap_element* table;
};

我当前的非工作发布例程如下所示:
void hm_release(struct hashmap* hm) {
hashmap_element* tmp;
hashmap_element* curr_itr;
for(int x=0; x<hm->table_size; x++) {
curr_itr = &hm->table[x];
while (curr_itr) {
tmp = curr_itr->next;
free(curr_itr);
curr_itr = tmp;
}
}
free(hm->table);
free(hm);
}

不幸的是,这个当前的 segvaults 在第一次运行后。我似乎无法让我的 'curr_itr' 锁定到数组中每个存储桶的第一个链上。我对在 C 中使用这样的动态内存还很陌生,并且已经坚持了几天。

据我所知,一切都被正确初始化。例如,这里是我的 hashmap init 函数。
hashmap* hm_initialize() {
hashmap* hm = malloc(sizeof(hashmap));
hm->table = (hashmap_element*) calloc(INIT_SIZE, sizeof(hashmap_element));
hm->table_size = INIT_SIZE;
hm->current_size = 0;

// init the buckets
for (int x=0; x < hm->table_size; x++) {
hm->table[x].used=0;
hm->table[x].value=0;
hm->table[x].key=0;
hm->table[x].next=NULL;
}
return hm;
}

任何建议/意见将不胜感激。如果您需要更多我的代码,请告诉我。

谢谢。

最佳答案

你开始释放太早了,

for(int x=0; x<hm->table_size; x++) {
curr_itr = &hm->table[x];
while (curr_itr) {
tmp = curr_itr->next;
free(curr_itr);
curr_itr = tmp;
}
}
hashmap_element hm->table[x]不是 malloc ed,所以你不应该 free它。
for(int x=0; x<hm->table_size; x++) {
curr_itr = hm->table[x].next;
while (curr_itr) {
tmp = curr_itr->next;
free(curr_itr);
curr_itr = tmp;
}
}

仅释放(希望) malloc编辑 hashmap_element在存储桶中的第一个之后。

关于c - 释放 C 语言中的 HashMap 桶数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11848792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com