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

C语言struct程序函数单独运行正常组合调用崩溃求助

问题根因

程序崩溃的直接原因是未定义的表达式求值顺序,以及变量未初始化:
你写的这行代码存在严重的顺序问题:

all_areas[area_number] = empty_trash(compare_trash_to_empty(area1, area2, area3, area4, &area_number), co2_counter_p, time_counter_p);

C语言标准没有规定赋值表达式中,左值(all_areas[area_number])和右值(empty_trash(...))的求值顺序。绝大多数编译器会优先计算左值的内存地址,再计算右值:

  1. 第一次进入循环时,area_number是未初始化的局部变量,值是随机垃圾值
  2. 编译器先计算左值下标area_number,用随机值访问all_areas数组,直接越界访问非法内存,导致程序崩溃

就算你给area_number赋了初始值,这个写法依然属于未定义行为,不同编译器、不同编译选项下运行结果都会不一致。

修复方法

把这一行拆成两行,先执行compare_trash_to_empty拿到正确的索引,再执行赋值操作,强制保证执行顺序:

// 先获取要操作的区域索引和对应结构体
struct area to_empty = compare_trash_to_empty(area1, area2, area3, area4, &area_number);
// 清空后赋值到对应下标位置
all_areas[area_number] = empty_trash(to_empty, co2_counter_p, time_counter_p);

其他潜在问题

  1. all_areas数组和独立area变量不同步
    你初始化all_areas的时候是把area1/area2/area3/area4的值拷贝到数组里,后续循环中你修改的是独立的area1-area4变量,all_areas里的元素不会同步更新。后续你把清空后的结构体赋值回all_areas,也不会修改外面的area1-area4,下一次循环还是用的没清空的旧值,不符合你的设计预期。
    建议直接用all_areas数组存储所有区域数据,不要单独定义area1-area4变量,避免数据不同步。

  2. 无符合阈值的区域时的边界问题
    compare_trash_to_empty函数中,如果4个区域的平均值都低于MARGIN=70,则highBlock会保持初始值0,返回的是索引为0的空结构体,此时你赋值给all_areas[0]虽然不会崩溃,但不符合业务逻辑,建议增加对应的判断处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:54:00