2014-10-20 115 views
2

我有以下代码:C,错误:表达式必须为可修改的左值

#define NULL ((void*)0) 
void* Globalptr = NULL; 
void func(ptrtype* input) 
{ 
((ptrtype*)Globalptr) = input; 
} 

我得到线((ptrtype*)Globalptr) = input;错误说“表达必须修改的左值”

+0

为什么你需要#define NULL?需要对值进行类型转换以适应变量。 – Gopi 2014-10-20 12:01:19

+3

应该通过包含'stdlib.h'或其他定义它的头文件来引入'NULL';不要自己写。 – 2014-10-20 12:02:23

回答

7

必须使数据相匹配的变量(左值),并不会改变变量的类型相匹配的数据:

Globalptr = (void*)input; 

但因为你可以将任何数据指针转换为void* C,你可以简单地做:

Globalptr = input; 
3

当使用空指针,必须强制类型转换一样

Globalptr = (void *)input; 

,而不是像

((ptrtype*)Globalptr) = input; 
+1

'Globalptr =(ptrtype *)input;'在这种情况下没有意义,因为它已经是ptrtype * – 2014-10-20 11:59:17

0

请确保您应该包括页眉文件stdlib.h引入NULL,也不要像你所做的那样自行创建NULL。

#include<stdlib.h> 
void* Globalptr = NULL; 
void func(ptrtype* input) 
{ 
    Globalptr = input; 
} 
0

这始终工作无论指针的类型是(在函数内部,为你的):

Pointer_Type pointer_1 = *((Pointer_Type*) pointer_2); 
0

这本来是有道理的,如果GlobalPtr是类型的“ptrtype *”,并输入了键入“无效*”像下面的:

ptrtype *Globalptr = NULL; 
void func(void *input) 
{ 
    Globalptr = (ptrtype *)input; 
} 

你的情况,你可以做的就是从Globalptr“无效*”到“ptrtype *”转换。 像其他人一样,不应该以这种方式使用“NULL”。

0

这里真正的问题是演员阵产生一个右值,赋值运算符的左操作数需要一个可修改的左值。

这就是为什么表达式((ptrtype *)Globalptr)不正确,正如其他人指出的那样,在赋值运算符的右侧进行转换。详情请参阅lvalue_rvalue_link

相关问题