入手したライブラリを使用して非常に単純な 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 -マティ