Я работаю над консольной игрой, в которой у меня есть следующие фрагменты кода:
typedef struct player{
char *name;
/* ... */
char location;
char traveltime;
/* ... */
}pl;
typedef struct planet{
char *name;
/* ... */
}planet;
pl *players;
planet plan[22];
pl * проигрыватели malloc'd с
players=malloc(NPLAYERS*sizeof(pl));
где NPLAYERS - количество игроков.
plan [] - это массив всех планет в игре.
players[i].location
- расположение игроков в качестве индекса для планирования [], если игроки [i] .traveltime == 0. Если игроки [i] .traveltime> 0, игрок отправляется к игроку [i] .location.
Поэтому, когда игрок путешествует, я хочу отобразить окно ncurses с надписью «На пути к (планете)».
для этого я использую:
char *tmp, msg[]="PLAYER 1", i;
for(i=0; i!=NPLAYERS; ++i){
infobox(msg);
if( players[i].traveltime>0){
tmp=malloc( sizeof("en route to ")+sizeof(plan[ players[i].location ].name)+4)
strcpy(tmp, "en route to ");
strcat(tmp, plan[ players[i].location ].name);
strcat(tmp, "..\0");
infobox(tmp);
free(tmp);
}
++msg[7];
}
где infobox (char msg []) печатает окно ncurses, содержащее сообщение для stdout, а NPLAYERS - количество игроков. Идея состоит в том, что этот код перебирает всех игроков, проверяет, путешествуют ли они, и если да, печатает сообщение с указанием их пунктов назначения.
Это работает девять из десяти раз, но иногда оно дает ошибку сегментации при свободном (tmp), это дает ошибку сегмента при malloc или печатает
***** glibc detected *** ./st: malloc(): memory corruption [a hex number] ***
после malloc.
Почему это происходит и как я могу это решить?
Это может помочь узнать, что я использую Arch Linux на двухлетнем ноутбуке.