c - 如何在 C 中存储指向已分配内存区域的偏移位置的指针?

标签 c pointers lvalue

我正在尝试用我得到的库制作一个非常简单的哈希表。我尝试创建的行包含 C 字符串或 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 -Matti

最佳答案

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

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

您应该做的是将指针值memcpy到您想要的位置。 当您想使用指针时,您需要将其memcpy返回到指针变量。

关于c - 如何在 C 中存储指向已分配内存区域的偏移位置的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8229915/

相关文章:

C 通过管道连接到另一个程序的 STDIN 并执行

c - 从 C 函数返回 char 指针

c - 指向引用加上数组之一的指针

没有类型推导的 LValue 和 Rvalue 的 C++ 引用

c++ - 是 int & foo();一个左值?

c - c中的二进制整数到整数数组

c - 为什么数组和指针属于二级常量?

c - 'unary *' 的类型参数无效(有 'int' )。基本上我在指针和结构的逻辑上遇到了麻烦

c++ - 编译为 C++ 但不是 C(错误 : lvalue required as unary '&' operand)

c++ - 使用#pragma 优化的代码的可移植性如何?