C,错误:表达式必须是可修改的左值

时间:2014-10-20 11:53:20

标签: c pointers casting void-pointers

我有以下代码:

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

我在行((ptrtype*)Globalptr) = input;上得到错误说“表达式必须是可修改的左值”

6 个答案:

答案 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了解详情。