void* 强制转换为 char* 而不是左值?

void* cast to char* not lvalue?

我正在尝试制作一个接受 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)

expression must me a modifiable 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;.