我有以下代码:
#define NULL ((void*)0)
void* Globalptr = NULL;
void func(ptrtype* input)
{
((ptrtype*)Globalptr) = input;
}
我在((ptrtype*)Globalptr) = input;
这行代码上遇到了错误,提示“表达式必须是可修改的左值”。
我有以下代码:
#define NULL ((void*)0)
void* Globalptr = NULL;
void func(ptrtype* input)
{
((ptrtype*)Globalptr) = input;
}
我在((ptrtype*)Globalptr) = input;
这行代码上遇到了错误,提示“表达式必须是可修改的左值”。
你必须让数据与变量(左值)匹配,而不是改变变量的类型以适应数据:
Globalptr = (void*)input;
但是在C语言中,由于可以将任何数据指针转换为void*
,所以你只需要这样做:
Globalptr = input;
Globalptr = (void *)input;
而不是像
((ptrtype*)Globalptr) = input;
Globalptr = (ptrtype *)input;
没有意义,因为它已经是 ptrtype*
。 - Gunther Van Butsele#include<stdlib.h>
void* Globalptr = NULL;
void func(ptrtype* input)
{
Globalptr = input;
}
无论指针的类型是什么(在函数内部,就像你的代码一样),这总是有效的:
Pointer_Type pointer_1 = *((Pointer_Type*) pointer_2);
如果 GlobalPtr 是 "ptrtype *" 类型,输入参数是 "void *" 类型,那么这样做就有意义:
ptrtype *Globalptr = NULL;
void func(void *input)
{
Globalptr = (ptrtype *)input;
}
这里的真正问题是强制类型转换产生了一个rvalue,而赋值运算符的左操作数需要一个可修改的lvalue。
这就是为什么表达式((ptrtype*)Globalptr)不正确,正如其他人指出的那样,强制类型转换应该在赋值运算符的右侧执行。
请参阅lvalue_rvalue_link以获取详细信息。
stdlib.h
或其他定义了NULL的头文件来引入NULL,而不是自己编写代码定义它。请注意不要改变原意。 - M.M