2

我已经在 C 中实现了一个 hashmap,经过相当多的工作,我得到了一切正常工作......除了我的发布例程。

我的结构是这样设置的:

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;
}

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

谢谢你。

4

1 回答 1

3

你开始过早地释放,

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编辑,所以你不应该这样做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;
    } 
}

仅释放桶中第一个之后的(希望) malloced 。hashmap_element

于 2012-08-07T15:10:43.637 回答