首页 > 解决方案 > 结构释放内存功能 - c

问题描述

我有一个我制作的程序并且它运行完美!唯一的问题是免费指针功能这是完整代码的链接https://codeshare.io/aVE3n3

问题是我成功释放了播放器名称指针,但是在程序不让我释放播放器指针之后。我很想得到一些帮助,谢谢。

    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]);
    }
}

标签: cmemory-managementstruct

解决方案


第一个错误的部分是

    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 - 我要转换 malloc 的结果吗? - 堆栈内存溢出

第二个错误的部分是freeTeam功能。

  • free(t->players[i].name);可能会导致双重(或更多)免费,因为只有t[0]被处理。
  • free(t[i].team_name);由于循环的使用错误,可能会导致两次(或更多)自由和/或越界读取。
  • 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);in之后被释放main()

int main(void)此外,您应该在托管环境中使用 standard而不是void main(),这在 C89 中是非法的,并且在 C99 或更高版本中是实现定义的,除非您有特殊原因使用非标准签名。


推荐阅读