Первая неправильная часть:
t->players = (player**)calloc(t->max_players, sizeof(player*));
в initTeam()
.
t->players
имеет тип player*
и тип его элемента player
. В типичной среде player
(один указатель и другие элементы) потребляют больше памяти, чем player*
(один указатель), поэтому вы не сможете выделить здесь достаточно памяти.
Это должно быть
t->players = calloc(t->max_players, sizeof(player));
или
t->players = calloc(t->max_players, sizeof(*t->players));
(примечание: c - Приведу ли результат mallo c? - Переполнение стека )
Второй неправильная часть - это функция freeTeam
.
free(t->players[i].name);
может привести к двойному (или более) освобождению, потому что обрабатывается только t[0]
. free(t[i].team_name);
может вызвать двойное (или более) свободное чтение и / или чтение за пределами диапазона, потому что использование l oop неверно. free(t[j]);
недопустимо, потому что структура не является указателем.
Это должно быть
void freeTeam(team* t,int size)
{
int temp;
for (int j = 0; j < size; j++)
{
temp = t[j].current_players;
for (int i = 0; i < temp; i++)
{
free(t[j].players[i].name);
}
free(t[j].players);
free(t[j].team_name);
}
}
, после этого t
должно быть освобождено после freeTeam(t,size);
в main()
.
Дополнительно, вы должны использовать стандартный int main(void)
в размещенной среде вместо void main()
, что недопустимо в C89 и определяется реализацией в C99 или новее, если у вас нет особых причин использовать нестандартную подпись.