c - 结构释放内存功能 - 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]);
}
}
解决方案
第一个错误的部分是
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 或更高版本中是实现定义的,除非您有特殊原因使用非标准签名。
推荐阅读
- html - 部分下的中心 div
- netbeans - 如何解决在 Netbeans 中找不到 ClientDriver 的问题?
- javascript - 我如何在 API javascript 中获取数据?
- google-bigquery - 立即执行:警告:无法计算脚本的已处理字节数估计
- linux - 为 Mattermost 构建 Docker,未找到 /bin/sh dnf
- amazon-web-services - 获取 ENI 并将它们解析为 CloudFormation 中的 IP
- tensorflow - CNN模型突然停止学习,返回空白输出怎么办?
- python - 用漂亮的汤瞄准第三个列表项
- r - 如何使用 Animation 包累积/保留旧帧?
- python - 尽管使用了“字符串替换”和“删除标点符号”,但仍无法从 pandas 文本数据框中删除 '