2013-08-28 69 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; 
} 

的叔值>表[散列]不會被更改爲新的,即使我將新分配給bucket,我認爲我設置爲指向t-> table [hash]指向的內存塊。我究竟做錯了什麼?

+0

您正在更改'bucket'指針本身,而不是它指向的值。 –

+0

對不起,我應該如何聲明'bucket',以便當我將'bucket'設置爲一個新的'Entry'時,那麼't-> table [hash]'也會被分配爲新的Entry?我希望能夠做到像'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; 

後來再後來就

return x; 

理解上

bucket = y; 

所以你需要一個地方行

t->table[hash] = new; 

但要小心內存泄漏。