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

3

我有以下代码:

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

我在((ptrtype*)Globalptr) = input;这行代码上遇到了错误,提示“表达式必须是可修改的左值”。


为什么需要定义 NULL 的 #define?类型转换需要进行,以使值适合变量。 - Gopi
3
应该通过包含stdlib.h或其他定义了NULL的头文件来引入NULL,而不是自己编写代码定义它。请注意不要改变原意。 - M.M
6个回答

8

你必须让数据与变量(左值)匹配,而不是改变变量的类型以适应数据:

Globalptr = (void*)input;

但是在C语言中,由于可以将任何数据指针转换为void*,所以你只需要这样做:

Globalptr = input;

3
当使用无类型指针时,需要进行类型转换,如下所示:
Globalptr = (void *)input;

而不是像

((ptrtype*)Globalptr) = input;

1
在这种情况下,Globalptr = (ptrtype *)input; 没有意义,因为它已经是 ptrtype* - Gunther Van Butsele

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 *" 类型,输入参数是 "void *" 类型,那么这样做就有意义:

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

在你的情况下,你可以将Globalptr从“void *”转换为“ptrtype *”。 正如其他人已经提到的,不应该以这种方式使用“NULL”。

0

这里的真正问题是强制类型转换产生了一个rvalue,而赋值运算符的左操作数需要一个可修改的lvalue。

这就是为什么表达式((ptrtype*)Globalptr)不正确,正如其他人指出的那样,强制类型转换应该在赋值运算符的右侧执行。

请参阅lvalue_rvalue_link以获取详细信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接