C 分段错误:11
我有一个函数,它从一个数组中查找大量匹配项,并查找匹配项中满足某些条件的所有团队。当找到它们时,需要将它们分配到新阵列。新数组应用作输出参数 我得到了分段错误:11当我调用它。我试过调试,但似乎不知道为什么。主要声明如下:C 分段错误:11,c,segmentation-fault,C,Segmentation Fault,我有一个函数,它从一个数组中查找大量匹配项,并查找匹配项中满足某些条件的所有团队。当找到它们时,需要将它们分配到新阵列。新数组应用作输出参数 我得到了分段错误:11当我调用它。我试过调试,但似乎不知道为什么。主要声明如下: TEAM team_least_viewers; double spectators = 99999; solve_task_four(round, team, &team_least_viewers, &spectators); 以及功能本身: v
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;
}
}
}
}
非常感谢您的帮助。多个操作系统上的SIGSEGV是信号11,并在出现分段故障时发送给进程 当您的程序以不允许的方式访问内存时,会发生分段错误,通常是通过尝试取消对空指针的引用或从数组末尾运行 在您的程序中,最有可能的罪魁祸首是数组索引、第[i]轮、匹配[j]和团队[k]。另一种可能性是,如果通过的旁观者论点不是写作的有效地点,但在这种特殊情况下,这是不可能的。您可能希望在调试器中插入代码/运行以检查每个访问是否正确
特别是,假设你的回合数为季&c。值是正确的,似乎最有可能的是,如果您的轮数组未完全初始化,则某个轮[i]。match包含空值。我推断您的问题是:如何找出导致分段错误的原因?如果这是正确的,那么一个答案就是使用调试器。另一个答案是在代码中添加打印语句。segfault几乎可以肯定是数组索引之一,如round[i]或round[i].match[j],因此一定要打印i和j值。您可能正在索引数组末尾或取消对空指针或未初始化指针的引用,因此请打印指针值,如%p\n、i和round[i]处的printfround[%d]。ifteam[k]。观众之家去年<*观众比较双打不是个好主意。@hbagdi:为什么比较双打是个坏主意?您能发布团队吗,圆形和匹配结构?此外,round[i]。match[j]。home_team==team[k]。如果您希望在此处进行字符串比较,name将无法进行字符串比较。分段错误发生在哪里?团队和回合是如何定义的?数组中有哪些数据?我建议您使用gdb之类的调试器来详细了解根本原因。这样你会学到很多。虽然它在技术上是正确的,但它并不能解释它为什么会发生,这似乎是这里的问题。@LudaOtaku我明白了,我误解了这个问题,因为我不理解错误信息,而不是错误本身。
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;