【问题标题】:void* cast to char* not lvalue?void* 强制转换为 char* 而不是左值?
【发布时间】:2017-09-08 08:36:54
【问题描述】:

我正在尝试创建一个接受void* 的函数,将一些内存复制到其中,然后移动指针。 由于它是一个 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)

表达式必须是一个可修改的左值

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

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;
}

如果有人能解释为什么第一个版本不能工作,我会非常感激。

【问题讨论】:

  • 你不能转换赋值的左操作数。
  • 可以说这应该被标记为 C,而不是 C++。
  • @nwp - const Message&message.msg.c_str() 没有争论的余地。

标签: c++ void-pointers lvalue


【解决方案1】:

((char*)dest) 为您提供一个新的临时char *((char*)dest) += size; 会改变临时的,没有效果,导致编译失败。

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

您也可以写成return (char*)dest + size;

【讨论】:

    猜你喜欢
    • 2011-06-17
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    相关资源
    最近更新 更多