首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hashtable Add

Hashtable Add
EN

Stack Overflow用户
提问于 2015-12-12 10:15:20
回答 1查看 240关注 0票数 0

获取以下算法的一些分段错误,以便在哈希表中向正确的桶中添加一个元素。

我的结构是基本的:

代码语言:javascript
复制
struct kv {
    char* key;
    unsigned val;
    struct kv* next;
};

struct hashtable {
    struct kv** table;
    unsigned size;
}; 

我的马车功能:

代码语言:javascript
复制
    struct kv* ht_find_or_put(char* word, unsigned value,
                                  struct hashtablet* hashtable,
                                  unsigned (*hash)(char*))
    {
        unsigned index = hash(word) % hashtable->size;
        struct kv* ke = malloc(sizeof (struct kv));

        for (ke = hashtable->table[index]; ke != NULL; ke = ke->next)
        {
            if (strcmp(ke->key, word) == 0)
                return ke;
        }

        if (ke == NULL)
        {
            ke->key = word;
            ke->val = value;
            ke->next = hashtable->table[index];
            hashtable->table[index] = ke;
        }
   return ke;
}

我知道我还没有添加所有的测试(如果malloc失败的话),只是尝试调试这个特定的问题.

我的桌子是这样分配的:

代码语言:javascript
复制
struct hashtable* hashtable_malloc(unsigned size)
{
    struct hashtable *new_ht = malloc(sizeof(struct hashtable));
    new_ht->size = size;
    new_ht->table = malloc(sizeof(struct kv) * size);

    for(unsigned i = 0; i < size; i++)
        new_ht->table[i] = NULL;

    return new_ht;
}

任何形式的帮助都会受到极大的感谢。我才刚开始学。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-12 10:36:52

第一个问题是内存泄漏,例如-您使用malloc分配内存,但是在覆盖指针时失去了对它的引用:

代码语言:javascript
复制
// allocate memory
struct kv* ke = malloc(sizeof (struct kv));
//   lose the reference
//   VVVVVVVVVVV
for (ke = hashtable->table[index]; ke != NULL; ke = ke->next)

可能导致分段错误的第二个问题是,您试图取消引用一个空指针:

代码语言:javascript
复制
if (ke == NULL)
{
    // ke is NULL, you can't de-reference it
    ke->key = word;
    ke->val = value;
    ke->next = hashtable->table[index];
    hashtable->table[index] = ke;
}

解决办法是,只有在未能找到新元素的情况下,才分配和放置新元素:

代码语言:javascript
复制
struct kv* ht_find_or_put(char* word, unsigned value, struct hashtablet* hashtable, unsigned (*hash)(char*))
{
    unsigned index = hash(word) % hashtable->size;
    struct kv* ke;

    // first we try to find the node
    for (ke = hashtable->table[index]; ke != NULL; ke = ke->next)
    {
        if (strcmp(ke->key, word) == 0)
            return ke;
    }

    // didn't find it - lets create and put a new one.    
    if (ke == NULL)
    {
        ke = malloc(sizeof (struct kv));
        // later add a check if the allocation succeded...
        ke->key = word;
        ke->val = value;
        ke->next = hashtable->table[index];
        hashtable->table[index] = ke;
    }
    return ke;
}

因为我不想引入全新的代码,这只会让您感到困惑,所以我对原始代码做了最小的修改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34238665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档