即使在正确转换之后,增加 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 指针也需要左值的主要内容,如果未能解决你的问题,请参考以下文章