0

アドレスで何かを渡そうとしています。この場合は char 配列ですが、何でもかまいません。

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 関数内の 'value' の値を確認すると正しいのですが、関数が呼び出された後にメインにチェックインすると問題が発生します。正しいメモリアドレスに設定されていないようです。どうしてこれなの?

4

2 に答える 2

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

これは a へのポインターを取り、void *何かを指すようにします。

と:

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

これはtoのアドレスを渡すので、その値を設定できます。val2rickyHashTableGet

于 2012-11-27T03:22:45.767 に答える
0

get ルーチンでは、パラメーターとして void **get および *value = table->entries[0].value; にする必要があります。この呼び出しでは &val2 が使用されます。

于 2012-11-27T03:22:33.907 に答える