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(...))的求值顺序。绝大多数编译器会优先计算左值的内存地址,再计算右值:
- 第一次进入循环时,
area_number是未初始化的局部变量,值是随机垃圾值 - 编译器先计算左值下标
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);
其他潜在问题
all_areas数组和独立area变量不同步
你初始化all_areas的时候是把area1/area2/area3/area4的值拷贝到数组里,后续循环中你修改的是独立的area1-area4变量,all_areas里的元素不会同步更新。后续你把清空后的结构体赋值回all_areas,也不会修改外面的area1-area4,下一次循环还是用的没清空的旧值,不符合你的设计预期。
建议直接用all_areas数组存储所有区域数据,不要单独定义area1-area4变量,避免数据不同步。无符合阈值的区域时的边界问题
compare_trash_to_empty函数中,如果4个区域的平均值都低于MARGIN=70,则highBlock会保持初始值0,返回的是索引为0的空结构体,此时你赋值给all_areas[0]虽然不会崩溃,但不符合业务逻辑,建议增加对应的判断处理。
内容的提问来源于stack exchange,提问作者Thybo
相关产品推荐
相关产品推荐

