2013-08-28 2 views
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-> таблица [хеш] не будет меняются на новые, даже если я назначил новый для bucket, который, я думаю, решил указать на блок памяти, на который указывает t-> table [hash]. Что я делаю не так?

+0

вы изменяете 'bucket' указатель сам, а не значение, он указывает на. –

+0

Извините, как мне объявить 'bucket' таким образом, что, когда я устанавливаю' bucket' в качестве новой 'Entry', тогда' t-> table [hash] 'также будет назначена эта новая запись? Я хочу иметь возможность делать такие вещи, как 'bucket = bucket-> next', которые я не думаю, что могу делать с' t-> table [hash] '. – dyxh

ответ

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

Рассмотрим делает проблему легче понять:

Вы

int bucket = X; 

потом на

bucket = y; 

потом на

return x; 

Понял?

Так что вам нужно где-то линия

t->table[hash] = new; 

Но будьте осторожны утечек памяти.

Смежные вопросы