出现这个错误是因为取地址操作符 & 只能用于左值,而不能用于右值。(什么是左值和右值)
以下面代码为例:
c 代码:uint8_t* get_arg()
{
static uint8_t arg;
return &arg;
}
void deal_arg(uint8_t* arg)
{
printf("%d", *arg);
}
deal_arg(get_arg());
// 正常运行
c 代码:uint8_t get_arg()
{
static uint8_t arg;
return arg;
}
void deal_arg(uint8_t* arg)
{
printf("%d", *arg);
}
deal_arg(&get_arg());
// 报错:[错误] lvalue required as unary '&' operand
看代码片2,get_arg()
返回的不是变量 arg
吗,它看起来是一个左值啊,为什么会报非左值的错误。这便是C语言的陷阱!
这里容易产生的误解就是将函数 get_arg()
的返回值直接等同于变量 arg
了。实际上存在一个隐性的转换,即:当函数返回的是非地址类型,则会自动将返回值拷贝一份到临时存储区后再返回,于是返回值就成了右值类型。
可以通过下面👇这样增加中间变量过渡来解决:
c 代码:uint8_t get_arg()
{
static uint8_t arg;
return arg;
}
void deal_arg(uint8_t* arg)
{
printf("%d", *arg);
}
uint8_t arg_ = get_arg();
deal_arg(&arg_);