структуры освобождают память - c - PullRequest
1 голос
/ 09 мая 2020

У меня есть программа, которую я сделал, и она отлично работает! единственная проблема - это функция бесплатных указателей, это ссылка на полный код https://codeshare.io/aVE3n3

Проблема в том, что я успешно освободил указатель имени игрока, но после того, как программа не t позвольте мне освободить указатель игрока. Мне бы очень хотелось получить помощь, спасибо.

    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->players[i].name);
        }
        free(t->players);
        for (int i = 0; i < temp; i++)
        {
            free(t[i].team_name);
        }
        free(t[j]);
    }
}

1 Ответ

1 голос
/ 09 мая 2020

Первая неправильная часть:

    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 или новее, если у вас нет особых причин использовать нестандартную подпись.

...