如果我有一个void * x,但是我想把它转换为char *,那么++运算符会使它指向下一个字节,而不是下一个4字节块。
然而,当我这样做时:
(char *) x -= byte_length;
编译器抱怨:
Error, lvalue required as left value of assignment.
我哪里出错了? 感谢。
答案 0 :(得分:5)
我会这样做:
x = (char*)x - byte_length;
将x
投射到char*
,然后应用偏移,然后分配回x
。由于void*
与所有指针类型的赋值兼容,因此无需进一步转换。
答案 1 :(得分:5)
(char *)x
评估为与x
具有相同值但具有不同类型的临时值。编译器不允许临时使用-=
。做
x = (char *)x - byte_length;
情况类似于以下情况:
short x = 0;
(long)x += 1; // invalid; (long)x is a temporary
x = (long)x + 1; // works
答案 2 :(得分:2)
做这样的事情:
void* x;
char* cx = (char*)x;
cx -= byte_length;
x = cx;
答案 3 :(得分:1)
(char*) x -= byte_length;
在此声明中,(char*) x
创建了一个临时值,其中char*
为类型。您只能根据编译器分配变量,或者更准确地说, references (或lvalue
)。
获取引用的一种方法是将地址x 转换为char*
并解除引用:
*(char*) &x -= byte_length;
答案 4 :(得分:0)
(char*)x
是一个临时值,无法在内存中寻址。您无法对--
进行int i
,原因与(i+5)++
相同,您无法x=(char*)x-byte_length;
。
您应该改为{{1}}。