2016-11-26 117 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