我正在尝试使用我获得的库制作一个非常简单的哈希表。我尝试创建的行包含 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-马蒂