我有以下代码:
#define NULL ((void*)0)
void* Globalptr = NULL;
void func(ptrtype* input)
{
((ptrtype*)Globalptr) = input;
}
我在行((ptrtype*)Globalptr) = input;
上得到错误说“表达式必须是可修改的左值”
答案 0 :(得分:7)
您必须使数据与变量(左值)匹配,而不是更改变量的类型以匹配数据:
Globalptr = (void*)input;
但是,由于您可以将任何数据指针转换为C中的void*
,您只需执行以下操作:
Globalptr = input;
答案 1 :(得分:3)
使用void指针时,必须输入类似
的强制类型Globalptr = (void *)input;
并不喜欢
((ptrtype*)Globalptr) = input;
答案 2 :(得分:0)
请确保您应该包含头文件stdlib.h以引入NULL并且不要像您一样自己创建NULL。
#include<stdlib.h>
void* Globalptr = NULL;
void func(ptrtype* input)
{
Globalptr = input;
}
答案 3 :(得分:0)
无论指针的类型是什么(在函数内部,与你的一样),它总是有效:
Pointer_Type pointer_1 = *((Pointer_Type*) pointer_2);
答案 4 :(得分:0)
如果GlobalPtr的类型为“ptrtype *”并且输入类型为“void *”,那将是有意义的:
ptrtype *Globalptr = NULL;
void func(void *input)
{
Globalptr = (ptrtype *)input;
}
在您的情况下,您可以做的是将Globalptr从“void *”转换为“ptrtype *”。 与其他已经提到的一样,“NULL”不应该以这种方式使用。
答案 5 :(得分:0)
这里真正的问题是转换产生了一个rvalue,赋值运算符的左操作数需要一个可修改的左值。
这就是为什么表达式((ptrtype *)Globalptr)不正确,而其他人指出强制转换是在赋值运算符的右侧完成的。
请参阅lvalue_rvalue_link了解详情。