即使在正确转换之后,增加 void 指针也需要左值

Posted

技术标签:

【中文标题】即使在正确转换之后,增加 void 指针也需要左值【英文标题】:lvalue required on incrementing a void pointer even after proper casting 【发布时间】:2012-08-20 11:35:59 【问题描述】:

我正在实施memset() 方法。下面是代码sn-p:

void my_memset(void* ptr, int n, size_t size)

    unsigned int i;

    for( i = 0; i < size; ++i, ++(char*)ptr )
            *(char*)ptr = n;

我得到error 为:

prog.cpp: In function ‘void my_memset(void*, int, size_t)’:
prog.cpp:8: error: lvalue required as increment operand

当我将 ptr 的类型从 void* 更改为 int* 时,它是 compiles successfully。

为什么它要求左值?

【问题讨论】:

【参考方案1】:
void my_memset(void* ptr, int n, size_t size)

    char *cptr = (char *)ptr;
    char *limit = cptr + size;

    for(; cptr < limit; cptr++) 
        *cptr = n;
    

你不能通过这样的演员来增加,你不应该想要。

【讨论】:

【参考方案2】:

类型转换的结果不是左值。说,

float f = 3.14;
++((int)f);

这里我们将++ 运算符应用于一个 int 值,但我们没有要递增的 int 变量。所以一般情况下,类型转换不能产生左值。

【讨论】:

【参考方案3】:

你不能这样做的原因与你不能这样做的原因相同:

++someFunction();

 ++(a + b);

强制转换是一个表达式,表达式的结果没有可写的存储空间。

【讨论】:

以上是关于即使在正确转换之后,增加 void 指针也需要左值的主要内容,如果未能解决你的问题,请参考以下文章

指向函数指针的指针 - 表达式必须是可修改的左值

void指针意义Constvolatile#definetypedef接续符

即使在三元运算符中给出的左值很好,赋值语句也会出错

在C中增加强制转换的void指针

应用间接时,标准是不是要求指针变量的左值到右值转换?

指针左值错误