Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
结构释放内存函数-c_C_Memory Management_Struct - Fatal编程技术网

结构释放内存函数-c

结构释放内存函数-c,c,memory-management,struct,C,Memory Management,Struct,我有一个我做的程序,它运行得很好!唯一的问题是自由指针函数 这是完整代码的链接 问题是,我成功地释放了播放器名称指针,但程序不允许我释放播放器的指针。 我很想得到一些帮助,谢谢 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 &l

我有一个我做的程序,它运行得很好!唯一的问题是自由指针函数 这是完整代码的链接

问题是,我成功地释放了播放器名称指针,但程序不允许我释放播放器的指针。 我很想得到一些帮助,谢谢

    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]);
    }
}
void freeTeam(团队*t,整数大小)
{
内部温度;
对于(int j=0;jplayers[i].name);
}
免费(t->玩家);
对于(int i=0;i
第一个错误的部分是

    t->players = (player**)calloc(t->max_players, sizeof(player*));
initTeam()

t->player
具有类型
player*
,其元素类型为
player
。 在典型的环境中,
player
(一个指针和其他元素)比
player*
(一个指针)消耗更多的内存,因此您不会在这里分配足够的内存

应该是

    t->players = calloc(t->max_players, sizeof(player));
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);
    }
}

(注:)

第二个错误部分是
freeTeam
函数

  • free(t->players[i].name)t[0]
    ,因此code>可能导致双重(或更多)空闲
  • free(t[i].团队名称)可能导致双重(或更多)空闲和/或越界读取
  • free(t[j])无效,因为结构不是指针
应该是

    t->players = calloc(t->max_players, sizeof(player));
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);
    }
}
void freeTeam(团队*t,整数大小)
{
内部温度;
对于(int j=0;j
之后,
t
应该在
freeTeam(t,size)之后被释放
main()


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

@TarickWelling如果指针数组是动态分配的,您可以释放它。您的
#include
列表是错误的。您缺少
stdlib.h
,这是您正在使用的许多功能(例如
free
calloc
)的正确原型所必需的。您也没有正确使用
calloc
(您只传递了一个参数;它需要两个参数。此外,
free(t[j]);
不可能正确。它甚至不应该编译。
t[j]
是一个
团队
,而不是
团队*
@MikeCAT,这是我对给定的代码的猜测,而不是链接的代码。Did removeI进一步研究了链接的代码。它加载了逻辑或直接的编译器错误。应该使用的是双间接,错误的函数参数,等等。它看起来像是一系列不幸的错误猜测,其中很多都是错误的。我建议你想想你真正想做什么。值得注意的是,即使在修复了上述所有问题之后,OP最终也会在播放器名称字段上遇到双重空闲。他们在
nameLikeA
的构建循环中浅层复制了播放器结构,因此有两条
player
记录(一个在输入团队中,一个在结果团队中),将有
name
成员指向相同的内存。一旦对其中一个调用
freeTeam
,另一个将留下悬空指针。tnx很多家伙!