getTravelCO2函数迭代时因数组索引错误引发SegFault问题求助
问题分析与修复
你的代码存在多处致命错误,直接引发了段错误(SegFault)和逻辑混乱,逐一拆解并修复:
1. 数组越界访问(段Fault核心原因)
C语言数组索引从0开始,若MAX_NUM_TRIPS为10,数组有效索引范围是0~9,但你全程用tripTypes[MAX_NUM_TRIPS]、tripCO2s[MAX_NUM_TRIPS]访问数组——这直接触碰了越界内存,触发段错误是必然结果。
你用TravelLoop从1开始计数行程,但未转换成正确的数组索引,应该用一个从0开始的计数器变量(比如tripCount),每新增一条行程就自增,直到达到最大行程数或用户选择结束。
2. totalTripCO2逻辑完全错误
- 你在case分支中直接将单条行程的CO₂值赋值给
*totalTripCO2,而非累加到总排放; - 后续多余的
*totalTripCO2 += tripCO2s[MAX_NUM_TRIPS - 1]还会重复累加错误索引的值; - 额外注意:调用该函数时,要确保传入的
totalTripCO2指针指向的变量已经初始化为0,否则初始值会是垃圾值。
3. tripNames参数传递错误
getTripName的第二个参数应该是当前行程的名称数组,即tripNames[tripCount],但你传了tripNames[MAX_TRIP_NAME_LEN]——这又是一次越界访问,因为tripNames第一维的有效索引是0~MAX_NUM_TRIPS-1。
4. 多余的错误操作
代码末尾的tripTypes[MAX_NUM_TRIPS - 1]++;完全多余,会篡改最后一条行程的类型值,直接删除即可。
5. 返回值不符合要求
函数要求返回实际录入的行程数量,但你当前返回0,应改为返回最终的tripCount。
修复后的完整代码
#include <stdio.h> // 假设以下辅助函数已正确实现 int getIntInput(const char* prompt, int min, int max); float getFloatInput(const char* prompt); void getTripName(const char* prompt, char tripName[MAX_TRIP_NAME_LEN]); // 定义常量(可根据实际需求调整) #define MAX_NUM_TRIPS 10 #define MAX_TRIP_NAME_LEN 11 // 预留1位存字符串结束符 int getTravelCO2(float tripCO2s[MAX_NUM_TRIPS], int tripTypes[MAX_NUM_TRIPS], char tripNames[MAX_NUM_TRIPS][MAX_TRIP_NAME_LEN], float *totalTripCO2, float CO2FactorBus, float CO2FactorTrain, float CO2FactorPlane) { printf("\n以下将统计你过去一年的出行情况,最多可录入10条行程。\n"); int tripCount = 0; // 循环条件:未达到最大行程数 while (tripCount < MAX_NUM_TRIPS) { printf("\n第%d条行程的出行方式?\n", tripCount + 1); printf("1) 公交\n"); printf("2) 火车\n"); printf("3) 飞机\n"); printf("4) 结束录入\n"); // 读取当前行程类型,存入正确索引位置 tripTypes[tripCount] = getIntInput("请输入选项(1-4): ", 1, 4); if (tripTypes[tripCount] == 4) { break; } // 读取行程名称,传入当前行程的名称数组 getTripName("\n请输入行程名称(最多10个字符): ", tripNames[tripCount]); float km = 0.0f; switch (tripTypes[tripCount]) { case 1: km = getFloatInput("\n请输入该次公交出行的总公里数: "); tripCO2s[tripCount] = km * CO2FactorBus; break; case 2: km = getFloatInput("\n请输入该次火车出行的总公里数: "); tripCO2s[tripCount] = km * CO2FactorTrain; break; case 3: km = getFloatInput("\n请输入该次飞机出行的总公里数: "); tripCO2s[tripCount] = km * CO2FactorPlane; break; default: tripCO2s[tripCount] = 0.0f; break; } // 累加当前行程的CO₂到总排放 *totalTripCO2 += tripCO2s[tripCount]; // 计数器自增,准备下一条行程 tripCount++; } printf("\n出行信息录入完成\n"); // 返回实际录入的行程数量 return tripCount; }
内容的提问来源于stack exchange,提问作者Jyeard
相关产品推荐
相关产品推荐

