0

假设我有以下功能:

Table * lookup_set(Table * t, char * key, ValueType value)
{
    int hash = lookup_hash(key);
    char * key_copy = strdup(key);
    Entry * bucket = t->table[hash];
    ...

然后稍后

    Entry * new = (Entry *) malloc(sizeof(Entry));
    new->key = key_copy;
    new->value = value;
    new->next = NULL;
    bucket = new;
    return t;
}

t->table[hash] 的值不会更改为 new,即使我将 new 分配给 bucket,我认为我将它设置为指向 t->table[hash] 指向的内存块。我究竟做错了什么?

4

2 回答 2

2

您可能想要的更像是:

Table * lookup_set(Table * t, char * key, ValueType value)
{
    int hash = lookup_hash(key);
    char * key_copy = strdup(key);
    Entry ** bucket = *t->table[hash];
        :
    Entry * new = (Entry *) malloc(sizeof(Entry));
    new->key = key_copy;
    new->value = value;
    new->next = *bucket;
    *bucket = new;
    return t;
}

bucket现在是指向指针的指针,允许您更改指向的指针的值。如果要bucket下移链表,需要使用

bucket = &(*bucket)->next;
于 2013-08-28T01:54:56.950 回答
0

考虑让问题更容易理解:

你有

int bucket = X;

然后稍后

bucket = y;

然后稍后

return x;

理解?

所以你在某处需要一条线

t->table[hash] = new;

但要小心内存泄漏。

于 2013-08-28T01:54:39.563 回答