我的功能可以通过数组中的许多匹配,并在比赛中找到所有球队,符合某些条件。当发现它们需要分配给新数组。新数组应用作输出参数。
我打电话时会得到segmentation fault: 11
。我试图调试,但似乎无法明白为什么。以下声明为主要:
TEAM team_least_viewers;
double spectators = 99999;
solve_task_four(round, team, &team_least_viewers, &spectators);
和功能本身:
void solve_task_four(ROUND *round, TEAM *team, TEAM *team_least_viewers, double *spectators) {
int i, j, k = 0;
for(i=0; i<ROUNDS_PR_SEASON; i++) {
for(j=0; j<MATCH_PR_ROUND; j++) {
if(round[i].match[j].year == 2015) {
/* Searching for team name in team[]*/
for(k=0; k<NUMBER_OF_TEAMS; k++) {
/* If it matches */
if (round[i].match[j].home_team == team[k].name) {
team[k].spectators_home_last_year += round[i].match[j].spectators;
}
}
}
}
for(k=0; k<NUMBER_OF_TEAMS; k++) {
if(team[k].spectators_home_last_year < *spectators) {
*spectators = team[k].spectators_home_last_year;
}
}
}
}
根据要求的结构:
typedef struct {
char weekday[WEEKDAY_SIZE], start_time[START_TIME_SIZE],
home_team[TEAM_SIZE], away_team[TEAM_SIZE];
double spectators;
int day, month, year, round, home_team_score, away_team_score;
} MATCH;
typedef struct {
MATCH match[MATCH_PR_ROUND];
} ROUND;
typedef struct {
char *name;
int points, matches_played,
matches_won, matches_draw, matches_lost,
matches_won_home, matches_won_away,
goals_for, goals_against, goal_difference;
double spectators_home_last_year;
} TEAM;
任何帮助都是多感谢。
我推断您的问题是:我如何弄清楚是什么原因导致分割错误?如果是正确的话,那么一个答案是使用调试器。另一个答案是在整个代码中添加打印语句。几乎可以肯定的是,segfault是阵列索引之一,例如圆形[i]或round [i] .match [j],因此请务必打印i和j值。您可能正在索引阵列的末端或取消指向零指针或非初始化的指针,因此请打印指针值,例如printf("round[%d] at %pn", i, &round[i])
。
在几个操作系统上的sigsegv是信号11,并在分割故障上传递到该过程。
当您的程序以不允许的方式访问内存时,会发生分割故障,通常是通过试图放置空指针或从数组的末端跑出。在您的程序中,最有可能的罪魁祸首是数组索引,round[i].match[j]
和team[k]
。(另一种可能性是,如果传递的spectator
参数不是写作的有效位置,但是在这种情况下这不太可能。)您可能希望在调试器中插入代码/运行以检查每个访问是否正确。
特别是假设您的ROUNDS_PR_SEASON
&amp; c。值正确,如果您的round
数组未完全初始化,则某些round[i].match
似乎很可能包含一个空。