【问题标题】:Using Increment operator with de-referencing in C在 C 中使用带取消引用的增量运算符
【发布时间】:2015-08-17 16:43:45
【问题描述】:

对于我的函数,我得到一个 void 指针,考虑到传入指针是 char 类型,我想指向下一个位置。

int doSomething( void * somePtr )
{
   ((char*)somePtr)++; // Gives Compilation error
}

我收到以下编译错误:

Error[Pe137]: expression must be a modifiable lvalue

这是运营商优先级的问题吗?

【问题讨论】:

  • 哪个编译错误?
  • 错误[Pe137]:表达式必须是可修改的左值
  • ((char*)somePtr) 不是变量,您不能对其进行加减。

标签: c pointers compilation compiler-errors dereference


【解决方案1】:

强制转换不会产生左值 (请参阅 C11 标准的第 6.5.4 节脚注 104),因此您不能将后增量 ++ 运算符应用于其结果。

c-faq: 4.5:

在 C 中,强制转换运算符并不意味着“假设这些位具有不同的类型,并相应地对待它们”; 它是一个转换运算符,根据定义,它产生一个右值,不能赋值给,也不能用 ++ 递增。 (如果特定编译器接受上述表达式,这要么是意外,要么是故意但非标准的扩展。)

试试这个

char *charPtr = ((char*)somePtr);
charPtr++;

【讨论】:

    【解决方案2】:

    如果要将指针移动到下一个,则可以使用:

    *ptr++;
    

    如果你想改变复制指针位置到另一个变量然后:

    char *abc = (char*)(def + 1);
    

    这真的取决于你做事的动机

    【讨论】:

    • 注意:您的代码暗示了 gnu c 兼容性。 std 没有定义对 void ptr 的添加。
    • 我同意,但他没有要求性病
    • 问题是我需要移动到下一个位置,但这是一个 void 指针,我试图告诉编译器我需要将其取消引用为 char 指针并递增。因此,问题陈述是同时执行这两项操作时会产生编译器错误
    • 问题是 op 可能不使用 gcc 或任何兼容的。未指定环境或工具链时,默认符合标准。
    猜你喜欢
    • 2021-10-20
    • 2016-10-16
    • 2016-12-01
    • 2023-04-01
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 2011-02-16
    相关资源
    最近更新 更多