网站LOGO
一路の数字花园 | Luyi's Blog
页面加载中
8月31日
网站LOGO 一路の数字花园 | Luyi's Blog
༺ζ❀梦里花落知多少꧔ꦿ༊
菜单
  • 用户的头像
    首次访问
    上次留言
    累计留言
    我的等级
    我的角色
    打赏二维码
    打赏博主
    出现:[错误] lvalue required as unary '&' operand
    点击复制本页信息
    微信扫一扫
    文章二维码
    文章图片 文章标题
    创建时间
  • 一 言
    确认删除此评论么? 确认
  • 本弹窗介绍内容来自,本网站不对其中内容负责。
    • 复制图片
    • 复制图片地址
    • 百度识图
    按住ctrl可打开默认菜单

    出现:[错误] lvalue required as unary '&' operand

    一路 · 原创 ·
    C/C++语言 · C/C++C陷阱
    共 658 字 · 约 2 分钟 · 641

    出现这个错误是因为取地址操作符 & 只能用于左值,而不能用于右值。什么是左值和右值

    以下面代码为例:

    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_);
    声明:本文由 一路 (博主)原创,依据 CC-BY-NC-SA 4.0 许可协议 授权,转载请注明出处。

    还没有人喜爱这篇文章呢

    我要发表评论 我要发表评论
    博客logo 一路の数字花园 | Luyi's Blog ༺ζ❀梦里花落知多少꧔ꦿ༊ 51统计
    ICP 鄂ICP备2025098605号 尊重原创内容,接纳多元文化,抵制不良信息,共建和谐网络。举报邮箱:luyi.hub@foxmail.com

    💻️ 站长 昨天 21:50 在线

    🕛

    本站已运行 168 天 13 小时 58 分

    ❤️

    Power by Typecho & MyLife | Dev by Luyi
    一路の数字花园 | Luyi's Blog. © 2025 ~ 2025.
    网站logo

    一路の数字花园 | Luyi's Blog ༺ζ❀梦里花落知多少꧔ꦿ༊