0

入手したライブラリを使用して非常に単純な Hashtable を作成しようとしています。作成しようとしている行には、C-string または int がキーとして含まれています。値には 4 つの異なるタイプがあります。構造体の場合は、ポインタを割り当てられたメモリ領域に格納しようとします。ただし、私の世界では、これは非ポインター フィールドと同じロジックには従わず、次のようになります。

error C2106: '=' : left operand must be l-value when I try to store pointer as value:

これがコードです

static void MakeRow(UtiHashtable_t *Hashtable, void *Key, void *Value, void *Row)
{
    int     KeySize, ValueSize;

    KeySize = sizeof(char) * Hashtable->KeyStringLength;
    ValueSize = GetValueSize(Hashtable);
    Row = malloc(KeySize + ValueSize);

    if (Hashtable->KeyType ==  MY_HASHTABLE_TYPE_STRING)  
        MyStrcpy((char *)Row, (char *)Key, Hashtable->KeyStringLength); 
    else if (Hashtable->KeyType ==  MY_HASHTABLE_TYPE_INT)
        ((int *)Row)[0] =  *(int *)Key;
    else
        MyAssert(0);

    switch (Hashtable->ValueType)
    {
    case MY_HASHTABLE_TYPE_STRING:
        MyStrcpy((char *)Row + KeySize, (char *)Value, Hashtable->ValueStringLength); 
        break;
    case MY_HASHTABLE_TYPE_INT: 
        *(int *)((char *)Row + KeySize) =  *(int *)Value;
        break;
    case MY_HASHTABLE_TYPE_DOUBLE: 
        *(double *)((char *)Row + KeySize) =  *(double *)Value;
        break;
    case MY_HASHTABLE_TYPE_STRUCT: 
        (int *)((char *)Row + KeySize) = (int *)Value;
        break;
    default:
        MyAssert(0);
    }
}

私はこれが本当に基本的なものであり、反対票がほとんど得られないことを知っていますが、答えに加えて、この * を取り除いてもポインターにならない理由を説明したいと思います。

コンパイラは次のことを許可します。

(int *)Value = (int *)Key;

では、なぜでしょうか:

(int *)((char *)Row + KeySize) = (int *)Value;

ありがとう & BR -マティ

4

2 に答える 2

1

左辺値でキャストを使用することは非推奨です。

intまた、一部のシステムでは、アラインメントの問題により、s またはポインタを任意のメモリ位置に配置することを許可していません。

あなたがすべきことはmemcpy、あなたが望む場所へのポインタ値です。memcpyポインターを使用する場合は、ポインター変数に戻す必要があります。

于 2011-11-22T16:30:16.043 に答える
0

左側の逆参照 * を中断したため、代入はもはや意味をなしません。

于 2011-11-22T16:13:29.783 に答える