结构释放内存函数-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)由于只处理
,因此code>可能导致双重(或更多)空闲t[0]
free(t[i].团队名称)由于循环的使用错误,code>可能导致双重(或更多)空闲和/或越界读取
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很多家伙!