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

Visual Studio C中传递结构体矩阵遇C2106错误:左操作数需为l-value

问题分析与解决方案

核心错误:C2106触发原因

C2106错误直接源于二维数组名是常量指针,不能作为赋值操作的左值。你在main.c中执行campo = play(...)时,campo作为二维数组,其内存地址是固定的,无法被重新赋值,这就触发了该错误。

同时存在类型不匹配问题:

  • 函数参数中的casa campo[DIM_CAMPO][DIM_CAMPO]会被编译器隐式转换为casa (*campo)[DIM_CAMPO](指向一维数组的指针)
  • 但函数返回类型声明为casa**,两者类型不兼容,进一步加剧了赋值操作的合法性问题。

其他潜在逻辑bug

代码中if (player.idP = idP)误用了赋值运算符=而非比较运算符==,这会导致条件永远为真(除非idP为0),同时错误修改了player.idP的值,完全偏离预期逻辑。

修复步骤

1. 移除数组名的赋值操作

二维数组传递给函数时,函数内的修改会直接作用于原数组(因为传递的是指针),无需返回数组。修改main.c中的调用代码:

// 去掉赋值操作,直接调用函数
play(gioca, campo, &sortedPlayers, roundPlayer);

2. 修正函数返回类型与声明

将函数返回类型改为void,同步更新头文件和函数定义:

头文件修改:

void play(int scelta, casa campo[DIM_CAMPO][DIM_CAMPO], playerlist* players, int idP);

函数定义修改:

void play(int scelta, casa campo[DIM_CAMPO][DIM_CAMPO], playerlist* players, int idP) {
    // 原有逻辑代码保持不变
    // ... 此处省略原有代码 ...
    // 移除最后一行的 return campo;
}

3. 修复条件判断的赋值错误

将赋值运算符改为比较运算符:

// 把 = 改为 ==
if (player.idP == idP) {
    // 玩家移动逻辑
}

4. 补全玩家位置的持久化逻辑

当前代码修改的是player副本的坐标,并未更新原链表中的数据,导致位置变化无法保存。在修改完玩家坐标后,需要将更新后的玩家信息写回链表:

// 修改完player坐标后,将其加入defPlayers
defPlayers = newPlayer(player, defPlayers);
// 跳出循环后,替换原链表为更新后的版本
*players = defPlayers;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:10:40