You need to enable JavaScript to run this app. C语言结构体字符数组成员赋值报数组类型错误 需生成双向城镇能耗记录
优惠活动
大模型
产品
解决方案
定价
更多

C语言结构体字符数组成员赋值报数组类型错误 需生成双向城镇能耗记录

C语言「Error: Assignment to expression with array type」报错原因及对应实现

报错核心原因

你写的赋值语句allTowns[i - 1].startTown = allTowns[i].endTown;触发报错,本质是C语言语法规则的硬性限制:

  • 结构体里定义的startTown、endTown都是固定长度的char[256]数组类型,属于实实在在占了256字节连续内存的内存块,不是可以存储地址的指针变量
  • 数组名是不可修改的地址常量,不属于可赋值的左值范畴,C语言完全不支持直接用=运算符对数组做整体内存拷贝
  • 编译器识别到你试图给数组类型的表达式直接赋值,就会抛出这个明确的编译错误。

当前代码的其他逻辑问题

除了语法层面的编译报错,你现有代码的执行逻辑离预期的输出效果还有明显偏差:

  • 赋值时序错误:循环内读完当前位置的记录后立刻做i自增,再取allTowns[i]做赋值源时,这个位置还没有写入任何从文件读到的有效内容,存的是未初始化的随机垃圾值,根本拿不到需要交换的城镇名称。
  • fscanf参数冗余:startTown、endTown作为数组名,本身就代表数组首元素的内存地址,传入读取参数时不需要再额外套&取地址,属于不符合C语言规范的冗余写法。
  • 循环判断逻辑错误:用while(!feof(文件指针))做循环条件是常见的使用误区,会导致文件内容全部读完后多执行一次循环,写入一条无效的垃圾记录到数组中,甚至可能造成数组越界。

符合目标需求的正确处理方式

要实现每读1条原始记录、自动生成对应反向条目的效果,处理流程应该调整为:

  • 每次从文件成功读取1条有效记录后,在结构体数组的下一个位置写入反向条目,保证原始记录在前、反向条目紧随其后
  • 字符串字段的内容拷贝必须调用标准库strcpy()完成逐字节的内存复制,不能直接用=赋值:
    // 刚成功读取完下标为rawIdx的原始记录
    int reverseIdx = rawIdx + 1;
    // 交换两个城镇字段的内容
    strcpy(allTowns[reverseIdx].startTown, allTowns[rawIdx].endTown);
    strcpy(allTowns[reverseIdx].endTown, allTowns[rawIdx].startTown);
    // 整数类型的能耗值可以直接赋值,不需要额外拷贝
    allTowns[reverseIdx].energyExpended = allTowns[rawIdx].energyExpended;
    
  • 将循环判断条件改为直接接收fscanf的返回值,只有当成功读到3个匹配的输入项时(返回值为3),才继续处理下一条记录,彻底避开feof的使用误区。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 19:36:01