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
相关产品推荐
相关产品推荐

