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 を割り当てても、t->table[hash] の値は new に変更されません。私は何を間違っていますか?

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 に答える