gpt4 book ai didi

C 如何释放多维动态结构中的动态字符串?

转载 作者:行者123 更新时间:2023-11-30 19:08:37 25 4
gpt4 key购买 nike

struct Link
{
frame_t *frame;
struct Link *next;
} typedef link_t;

里面我为frame_t分配内存我尝试递归地释放它,但是当我运行它时程序崩溃了。

struct Frame
{
char *name;
unsigned int duration;
char *path;
} typedef frame_t;

在其中我为名称和路径分配内存。

void freeFrames(link_t** head)
{
if (*head != NULL)
{
if ((*head)->next != NULL)
{
free((*head)->frame->name);
free((*head)->frame->path);
free((*head)->frame);
freeFrames(&((*head)->next));
}

free(*head);
}
}

如何为此释放内存?

最佳答案

  1. 您是否正确初始化了指针?如果您没有为它们分配具体值,则必须将它们初始化为 NULL。
  2. 您无法释放空指针,因此您应该检查:if(name) free(name);
  3. 您无法释放字符串文字!因此,如果您执行 name = "hello",那么您的程序肯定会失败。

此外,您还存在内存泄漏(从 n.m. 的评论中窃取了该内存...):

if ((*head)->next != NULL)
{
free((*head)->frame->name);
free((*head)->frame->path);
free((*head)->frame);
// ^ you will only free, if there is a successor node!
// so you won't free them on the last node!

freeFrames(&((*head)->next));
}

应该是(到目前为止还没有添加 NULL 检查!):

if(*head)
{
free((*head)->frame->name);
free((*head)->frame->path);
free((*head)->frame);
if ((*head)->next != NULL)
{
freeFrames(&((*head)->next));
}
free(*head);
}

另外:你没有给你的 head 分配任何东西(*head = NULL;),那么为什么你有一个双指针呢?

void freeFrames(link_t* head);

就够了...

而且不需要递归,只要有指针就可以前进:

void freeFrames(link_t* head)
{
while(head)
{
// free members, don't forget the NULL checks
link_t* tmp = head;
head = head->next;
free(tmp);
}
}

关于C 如何释放多维动态结构中的动态字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44817838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com