2012-11-27 99 views
0

我試圖通過地址傳遞某些東西。在這種情況下,一個char數組,但它可以是任何東西。C無效指針作爲參數

void rickyHashTableAdd(rickyHashTable *table, char *key, void *value) 
{ 
    rickyHashTableEntry entry; 
    entry.key = strdup(key);  
    entry.value = value; 
    table->entries[0] = entry; 
} 

int rickyHashTableGet(rickyHashTable *table, char *key, void *value) 
{ 
    value = table->entries[0].value; 
} 

int main (void) 
{  
    void *val; 
    val = "what up"; 
    rickyHashTableAdd(&symbolTable, "ok", val); 
    void *val2; 
    rickyHashTableGet(&symbolTable, "ok", val2); 
    printf("result: %s\n", val2); 

}

當我檢查rickyHashTableGet功能它是正確的內部「價值」,但是當我檢查在主函數被調用它的壞後的值。它似乎沒有設置到正確的內存地址。爲什麼是這樣?

+0

在將'val2'傳遞給'rickyHashTableGet'之前,您必須將'val2'設置爲某種類型的值!此外,'rickyHashTableGet'將'value'設置爲某個值,然後將其丟棄。你想退回嗎?或者你想傳遞一個指針而不是按值傳遞它? –

回答

0

在你的get例程中,它應該是void ** get作爲參數,* value = table-> entries [0] .value;該電話會使用& val2。

2
int rickyHashTableGet(rickyHashTable *table, char *key, void *value) 
{ 
    value = table->entries[0].value; 
} 

這忽略了通過的value。將value設置爲某個值,然後將其丟棄。這不可能是正確的。

void *val2; 
rickyHashTableGet(&symbolTable, "ok", val2); 

這不設置val2到任何東西,並且因此傳遞無意義值rickyHashTableGet。這是不對的。

你想:

int rickyHashTableGet(rickyHashTable *table, char *key, void **value) 
{ 
    *value = table->entries[0].value; 
} 

這需要一個指向void *並使其指向的東西。

和:

void *val2; 
rickyHashTableGet(&symbolTable, "ok", &val2); 

這傳遞地址val2rickyHashTableGet,所以可以將其值設置。