You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中对ptr+i赋值出现lvalue左值错误是什么原因?

报错原因分析

核心本质:左值定义不匹配

C语言规定,赋值运算符=的左侧必须是可修改的左值,即表达式需要对应一块实际存在、可写入的内存空间,不能是临时计算得到的中间值。

指针加法运算结果的属性

你定义的char *ptr本身是指针变量,属于合法左值,因为它对应一块存储指针值的内存,你可以执行ptr = ptr + 1这类修改指针本身值的操作。
但ptr + i是对指针做算术运算得到的临时地址值,属于右值,没有对应的可写入的内存空间,和算术表达式1 + 2的结果属于临时常量的性质完全一致,你不能写1 + 2 = 5,同理也不能写ptr + i = ptr + j,这就是左值错误的根本原因。

你提供的反转代码的额外问题

除了上述语法问题,你的代码逻辑本身也存在设计错误:

  • 字符串反转的核心是交换每个地址位置存储的字符值,不是交换地址本身,你当前的写法就算语法合法,也实现不了反转效果。
  • 临时变量temp类型定义错误:你声明的char *temp是字符指针类型,但你需要暂存的是单个字符值,应该改为char temp。

修正后的核心交换逻辑参考

// 注意循环边界要包含mid,否则会漏交换一组字符
for(i=0; i<=mid; i++)
{
    // 通过解引用操作符*访问地址对应的内存空间,操作的是存储的字符值
    temp = *(str+i);
    *(str+i) = *(str + (len-1 -i));
    *(str + (len-1 -i)) = temp;
}

内容的提问来源于stack exchange,提问作者user15933960

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 12:09:01