0

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

不推荐在左值上使用强制转换。

此外,由于对齐问题,某些系统不允许将ints 或指针放置在任意内存位置。

您应该做的是memcpy将指针值指向您想要的位置。而当你想使用指针时,你需要将memcpy它返回一个指针变量。

于 2011-11-22T16:30:16.043 回答
0

您离开了左侧的取消引用 *,因此分配不再有意义。

于 2011-11-22T16:13:29.783 回答