【问题标题】:C , Error: Expression must be a modifiable lvalueC,错误:表达式必须是可修改的左值
【发布时间】:2014-12-15 09:35:53
【问题描述】:

我有以下代码:

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

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

【问题讨论】:

  • 为什么你需要一个#define for NULL?需要进行类型转换以使值适合变量。
  • NULL 应该通过包含stdlib.h 或定义它的其他标题之一来引入;不是自己写的。

标签: c pointers casting void-pointers


【解决方案1】:

你必须使数据匹配变量(左值),而不是改变变量的类型来匹配数据:

Globalptr = (void*)input;

但由于您可以在 C 中将任何数据指针转换为 void*,您可以简单地这样做:

Globalptr = input;

【讨论】:

    【解决方案2】:

    当使用空指针时,必须像类型转换

    Globalptr = (void *)input;
    

    不喜欢

    ((ptrtype*)Globalptr) = input;
    

    【讨论】:

    • Globalptr = (ptrtype *)input; 在这种情况下没有意义,因为它已经是 ptrtype*
    【解决方案3】:

    请确保您应该包含头文件 stdlib.h 以引入 NULL,并且不要像您所做的那样自行创建 NULL。

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

    【讨论】:

      【解决方案4】:

      无论指针的类型是什么(在函数内部,就像你的一样),这总是有效的:

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

      【讨论】:

        【解决方案5】:

        如果 GlobalPtr 的类型为“ptrtype *”并且输入的类型为“void *”,如下所示:

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

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

        【讨论】:

          【解决方案6】:

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

          这就是表达式 ((ptrtype*)Globalptr) 不正确的原因,正如其他人指出的那样,强制转换是在赋值运算符的右侧完成的。

          详情请见lvalue_rvalue_link

          【讨论】:

            猜你喜欢
            • 2015-03-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-09-17
            • 2014-12-15
            • 2014-12-20
            • 2015-09-19
            相关资源
            最近更新 更多