2016-11-26 124 views
-3

我有一个函数,通过查看数组中的一些匹配项并查找所有符合条件的匹配项的团队。发现时,他们需要分配给一个新的阵列。新数组应该用作输出参数。我打电话给我时得到segmentation fault: 11。我试图调试,但似乎无法得到原因。以下是主要的声明:分段错误: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; 

任何帮助是赞赏。

+0

'if(team [k] .spectators_home_last_year <* spectators)'比较双打不是一个好主意。 – hbagdi

+0

@hbagdi:为什么会比较双打是一个坏主意? –

+0

你可以发布TEAM,ROUND和MATCH结构吗? 另外,如果你想在这里做什么,'round [i] .match [j] .home_team == team [k] .name'不能做字符串比较。 – hbagdi

回答

2

我推断你的问题是:如何找出导致分段故障的原因?如果这是正确的,那么一个答案是使用调试器。另一个答案是在整个代码中添加打印语句。 segfault几乎肯定是数组索引中的一个,如round [i]或round [i] .match [j],所以一定要打印i和j的值。您可能正在索引数组的末尾或解引用空指针或未初始化的指针,因此请打印指针值,如printf("round[%d] at %p\n", i, &round[i])

1

几个操作系统上的SIGSEGV是信号11,并在分段故障中传送到进程。

当程序以不允许的方式访问内存时,通常会试图取消引用空指针或脱离数组的末尾,会发生分段错误。

在你的程序中,最可能的罪魁祸首是数组索引round[i].match[j]和。 (另一种可能性是如果spectator参数传递不是有效的写入位置,但在这种情况下不太可能)。您可能希望在调试器中插入代码/运行以检查每个访问是否正确。

特别是,假设你的ROUNDS_PR_SEASON & c。值是正确的,如果你的round数组未被完全初始化,那么最有可能的一些round[i].match包含空值。

+0

虽然它在技术上是正确的,但它并不能解释它为什么会出现,这似乎是这里的问题。 – saeleko

+0

@LudaOtaku我看到,我误解为不理解错误信息而不是错误本身。 – muhmuhten