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

为何C语言中执行数组元素赋值时报「表达式必须是可修改左值」错误

报错根本原因

你对变量list的类型声明存在语义偏差,并非编译器误判了数组赋值规则。

类型解析错误

C语言中,数组下标运算符[]的优先级高于间接引用运算符*,你写的struct mystruct(*list)[10];经过语法解析后,实际类型为:

一个指向「长度为10的struct mystruct类型数组」的指针,而非你预期的“存储结构体指针的定长数组”。

两个结构相似的声明语义完全不同,是C语言声明语法中最容易混淆的场景:

  • struct mystruct (*list)[10];:list是单指针,指向一整个长度为10的结构体数组
  • struct mystruct* list[10];:list是长度为10的数组,每个元素是指向结构体的指针

报错触发逻辑

数组下标的本质等价于指针解引用,即list[0]和*(list + 0)完全等价。
由于list是指向数组的指针,list[0]对应的就是它指向的那个长度为10的结构体数组实体本身。而C语言中数组实体属于不可修改的左值,不允许直接对数组整体赋值,因此编译器会抛出“表达式必须是可修改的左值”的报错。
你误以为自己是在给指针元素赋值,本质上是在尝试把一个struct mystruct*类型的指针值,赋值给一个不可修改的数组实体,从左值属性到类型匹配性上都不成立。

匹配需求的正确写法

如果你需要的是“存储指向指定结构体的指针的定长数组”,直接去掉括号即可:

struct mystruct* list[10];

此时list[0]就是数组中存储的第一个结构体指针,是可修改的左值,类型和obj完全匹配,执行list[0] = obj可正常运行。

内容的提问来源于stack exchange,提问作者Lars Nyström

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 14:36:03