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

