[英]"double free or corruption" - free memory on array of structs - C
[英]structs free up memory function - c
我有一个我制作的程序并且它运行完美! 唯一的问题是自由指针 function 这是完整代码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]);
}
}
第一个错误的部分是
t->players = (player**)calloc(t->max_players, sizeof(player*));
在initTeam()
中。
t->players
的类型为player*
,其元素类型为player
。 在典型环境中, player
(一个指针和其他元素)比player*
(一个指针)消耗更多的 memory,因此您不会在此处分配足够的 memory。
它应该是
t->players = calloc(t->max_players, sizeof(player));
或者
t->players = calloc(t->max_players, sizeof(*t->players));
(注意: c - 我要转换 malloc 的结果吗? - 堆栈内存溢出
第二个错误的部分是freeTeam
function。
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);
}
}
之后,应该在freeTeam(t,size);
t
释放 t; 在main()
中。
另外,您应该在托管环境中使用标准int main(void)
而不是void main()
,这在 C89 中是非法的,并且在 C99 或更高版本中是实现定义的,除非您有特殊原因使用非标准签名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.