void*铸造到char*不是lvalue

void* cast to char* not lvalue?

本文关键字:不是 lvalue char void      更新时间:2023-10-16

我正在尝试制作一个符合void*的函数,将内存复制到它,然后移动指针。由于它是一个无效的指针,所以我想我会把它扔给 char*并像这样移动:

PVOID SendAndMoveHead(PVOID dest, const Message& message, const size_t& size)
{
    PVOID ret = CopyMemory(dest, (PVOID)message.msg.c_str(), size);
    ((char*)dest) += size;
    return ret;
}

但是,vs抱怨 ((char*)dest)

表达式必须一个可修改的lvalue

我认为是,因为以下工作:

PVOID SendAndMoveHead(PVOID dest, const Message& message, const size_t& size)
{
    PVOID ret = CopyMemory(dest, (PVOID)message.msg.c_str(), size);
    char* d = (char*)dest;
    d += size;
    return (PVOID)d;
}

如果有人可以阐明为什么第一个版本不应该工作,我会真正感激它。

((char*)dest)为您提供新的临时char *((char*)dest) += size;会改变临时性并且没有效果,这会导致汇编失败。

在第二个示例中, d不是临时的,而且寿命足够长以返回。

另外,您可以编写return (char*)dest + size;