2015-12-01 3 views
0

У меня, похоже, проблема с копированием массива char из структуры в другой массив символов в другой структуре. Я получаю ошибку сегментации, и я думаю, что она имеет какое-то отношение к распределению памяти для моего массива char в структуре. Но может кто-нибудь, пожалуйста, указать точную точку, вызывающую сброс ядра.strcpy из 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; 

Тогда у меня есть функция, которая заполняет-структуру под названием матч

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 из структуры соответствия, в имя 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); 
    } 
} 
+0

Не пропустите 'all_teams [J]', который имеет тип 'team' к первому аргумент 'strcpy()', который ожидает 'char *'. Это должно быть 'all_teams [j] .name'? – MikeCAT

+2

Вы вообще их выделяете? –

+4

Вы уверены, что выделили достаточное количество памяти для каждого параметра? Проводка [MCVE] (http://stackoverflow.com/help/mcve) полезна. – MikeCAT

ответ

1

scanf не будет выделять память, он будет пытаться писать в уже выделенный буфер (для всех аргументов% S, которые вы использовали).

Поскольку эти указатели являются мусором (никогда не выделяются), memcpy или strcpy не будет работать с ошибкой seg.

0

ваш:

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

имеет указатели на символы, но не имеет хранения для хранения этих символов. Поэтому, когда вы читаете их, они «хранятся» sscanf в каком-то неопределенном месте, что, вероятно, не принадлежит вам, поэтому операционная система прерывает вашу программу.

Либо объявить их как массивы символов, либо попросить sscanf прочитать их в буфер достаточного размера, затем определить его длину, а затем использовать malloc, чтобы выделить хранилище и скопировать буфер на это хранилище.

0

all_matches и all_teams не объявлен как массив

недействительные load_teams (матч * all_matches, команда * all_teams)

так что вы не можете использовать это:

зЬгсру (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)