Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 分段错误:11_C_Segmentation Fault - Fatal编程技术网

C 分段错误: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

我有一个函数,它从一个数组中查找大量匹配项,并查找匹配项中满足某些条件的所有团队。当找到它们时,需要将它们分配到新阵列。新数组应用作输出参数

我得到了分段错误: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;
     }
   }
  }
}

非常感谢您的帮助。

多个操作系统上的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;