gpt4 book ai didi

C - 表达式必须是可修改的左值

转载 作者:太空狗 更新时间:2023-10-29 17:22:07 27 4
gpt4 key购买 nike

我很困惑为什么我的编译器在以下情况下会抛出错误:

void funcExample (void * p_Buf, uint16_t len) 
{
uint16_t i;

for (i = 0; i < len; i++) {
otherFunc (((uint8_t *)p_Buf)++); //error = expression must be a modifiable lvalue
}
}

但是如果我在传递给 otherFunc 之前进行转换,那很好,因为递增非空指针没有问题:

void funcExample (void * p_Buf, uint16_t len) 
{
uint16_t i;
uint8_t * p_Buf_8bit;

p_Buf_8bit = (uint8_t *) p_Buf;

for (i = 0; i < len; i++) {
otherFunc (p_Buf_8bit++);
}
}

void 指针不能在施法后递增吗?我在这里错过了一些基本的东西吗?

最佳答案

C 中的转换运算符:

6.5.4. p5 Preceding an expression by a parenthesized type name converts the value of the expression to the named type. This construction is called a cast. 104) A cast that specifies no conversion has no effect on the type or value of an expression.

104) A cast does not yield an lvalue. Thus, a cast to a qualified type has the same effect as a cast to the unqualified version of the type

但是一元运算符 ++ 需要一个左值,如下所述:

6.5.3.1. p1 The operand of the prefix increment or decrement operator shall have atomic, qualified, or unqualified real or pointer type, and shall be a modifiable lvalue.

因此你可以这样做:

p_Buf = ( uint8_t* )p_Buf + 1 ;

其中 p_Buf 是左值,( uint8_t* )p_Buf 是右值。


请注意,在您的第二个示例中,您没有强制转换(如您所说),但您声明了一个 uint8_t 指针。然后,当您在其上使用 ++ 时,您不会执行任何转换(因为它具有正确的类型)并且该操作有效。

关于C - 表达式必须是可修改的左值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26470926/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com