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

C 如何在多维动态结构中释放动态字符串?,c,memory-management,memory-leaks,C,Memory Management,Memory Leaks,在内部,我为帧\u t分配内存 我尝试递归地释放它,但当我运行它时程序崩溃了 struct Link { frame_t *frame; struct Link *next; } typedef link_t; 在这里面,我为名称和路径分配内存 struct Frame { char *name; unsigned int duration; char *path; } typedef frame_t;

在内部,我为帧\u t分配内存 我尝试递归地释放它,但当我运行它时程序崩溃了

struct Link
{
    frame_t *frame;
    struct Link *next;
} typedef link_t;
在这里面,我为名称和路径分配内存

struct Frame
{
    char            *name;
    unsigned int    duration;
    char            *path;
} typedef frame_t;
我怎样才能为这个释放内存

  • 你是否正确地初始化了指针?如果没有为它们指定具体的值,则必须将它们初始化为NULL
  • 无法释放空指针,因此应选中:
    if(name)free(name)
  • 您不能释放字符串文字!因此,如果您执行
    name=“hello”
    ,您的程序在尝试执行此操作时肯定会失败
  • 此外,您还有一个内存泄漏(从n.m.的评论中盗取了一个…):

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

    另外:您没有向头部分配任何内容(
    *head=NULL;
    ),那么为什么要使用双指针呢

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

    并且不需要递归,只要存在以下情况,就可以简单地推进指针:

    void freeFrames(link_t* head);
    

    您还需要检查
    (*head)->frame
    是否不为空。请提供一个。如果(*head)->next!=NULL,则无法在没有看到整个程序的情况下说出它崩溃的原因,但您的freeFrames函数是错误的,它将无法释放列表最后一个元素的帧,这要感谢冗余的
    check。第一步是去掉指向指针和递归的指针。在执行
    free(*head)之前,你不想想吗您还需要一些条件吗?
    
    if(*head)
    {
        free((*head)->frame->name);
        free((*head)->frame->path);
        free((*head)->frame);
        if ((*head)->next != NULL)
        {
            freeFrames(&((*head)->next));
        }
        free(*head);
    }
    
    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);
        }
    }