strcpy从struct char *到另一个struct char * - 分段错误

时间:2015-12-01 15:36:02

标签: c arrays pointers struct segmentation-fault

我似乎在将一个char数组从struct复制到另一个struct中的另一个char数组时遇到了问题。我得到一个分段错误,我认为它与在struct中为我的char数组分配内存有关。但有人可以确定导致核心倾销的确切点。

struct match 
{
  char *day;
  char *date;
  char *hour;
  char *home_side;
  char *visitors;
  int home_result;
  int visit_result;
  int spectators;
  int rounds;
  int result;
};

struct team
{
  char *name;
  int victory_visit;
  int victory_home;
  int home_visitors;
};

typedef struct match match;
typedef struct team team;

然后我有一个填充结构名为match

的函数
    void scan_matches(match *all_matches)
{
  int i = 0, counter = 1, round_number = 1;;
  FILE *ifp = fopen("kampe.txt","r");
  char line[LINE_MAX];

  while(fscanf(ifp," %[^\n]", line) == 1)
  {
    int thousand, hundreds;
    sscanf(line,"%s %s %s %s - %s %d - %d %d.%d", &all_matches[i].day, &all_matches[i].date, &all_matches[i].hour, &all_matches[i].home_side, &all_matches[i].visitors,
      &all_matches[i].home_result, &all_matches[i].visit_result, &thousand, &hundreds);
    all_matches[i].spectators = ((thousand * 1000) + hundreds);
    round_number = create_rounds(all_matches, counter, i, round_number);
    counter++;
    i++;
  }
  fclose(ifp);
}

之后是导致我麻烦的功能。我希望将匹配结构的char * homeside复制到team struct中的char *名称的函数。

void load_teams(match *all_matches, team *all_teams)
{
  int i, j = 0;
  for(i = 0; i < 6; i++)
  {
    strcpy(all_teams[j],all_matches[i].home_side);
    j++;
    strcpy(all_teams[j],all_matches[i].home_side);
    j++;
  }
  for(i = 0; i < 12; i++)
  {
    printf("%s\n",all_teams[j].name);
  }
}

3 个答案:

答案 0 :(得分:1)

scanf将不会分配内存,它会尝试写入已分配的缓冲区(对于您使用的所有%s参数)。

由于这些指针是垃圾(从未分配),memcpystrcpy将因seg错误而失败。

答案 1 :(得分:0)

您:

struct match 
{
  char *day;
  //...

指针指向字符,但没有存储来存储这些字符。因此,当你阅读它们时,它们就会被存储起来&#34;由sscanf在某个未确定的地方,这可能不是你的,所以操作系统会中止你的程序。

将它们声明为字符数组,或让sscanf将它们读入足够大小的缓冲区,然后确定其长度,然后使用malloc分配存储并将缓冲区复制到该存储区。

答案 2 :(得分:0)

all_matches和all_teams未声明为数组

  

void load_teams(匹配* all_matches,team * all_teams)

所以你不能用这个:

  

的strcpy(all_teams [j]时,all_matches [I] .home_side);   J ++;   的strcpy(all_teams [j]时,all_matches [I] .home_side);   J ++;

你的功能应该像这样声明:

void load_teams(match **all_matches, team **all_teams)

同样的评论:

void scan_matches(match **all_matches)