首页 文章

在C中使用Free()时的运行时错误

提问于
浏览
0

我正在尝试在C中使用结构的链接列表,其中一个结构表示列表,另一个结构表示列表的成员 . 这是他们的定义:

typedef struct symEntry symEntry;

struct symEntry{
    const char * key;
    const void * value;
    struct symEntry * next;
    struct symEntry * linked;
    struct symEntry * previous;
};

typedef struct{
    symEntry* head;
    symEntry* tail;
    int size;
} symTab;

typedef symTab * SymTab;

我的问题是当我试图释放我分配的内存时 . 我分配所有它并返回列表的结构,如下所示:

SymTab ST_new()
{
    SymTab oSymTab = (SymTab)malloc(sizeof(SymTab));

    symEntry * head = (symEntry *)malloc(sizeof(symEntry));
    head->key = NULL;
    head->value = NULL;
    head->previous = NULL;
    head->linked = NULL;

    oSymTab->head = head;
    oSymTab->size = 0;

    ST_fill(oSymTab, sizeArray[currentSize]);
    return oSymTab;
}

void ST_fill(SymTab oSymTab, int size)
{
    symEntry * current;
    current = oSymTab->head;
    int i;
    for(i = 0; i < size-1; i++)
    {
        symEntry * entry = (symEntry *)malloc(sizeof(symEntry));
        entry->key = NULL;
        entry->value = NULL;

        entry->linked = NULL;
        entry->previous = current;
        current->next = entry;
        current = current->next;
    }

    current->next = NULL;
    oSymTab->tail = current;
}

因此,初始化头部然后根据我想要列表的任何大小初始化所有元素 . 设置next和previous,使previous在开始时为null,next在结尾为null . 当我尝试在使用后在单独的函数中释放内存时,我的问题才真正开始:

void ST_free(SymTab oSymTab)
{
    symEntry * current;
    symEntry * previous;
    current = oSymTab->head;

    while(current->next != NULL)
    {   
        previous = current;
        current= current->next;
        free(previous);
    }

    free(oSymTab);
}

如果我注释掉两个自由语句,代码运行没有问题(我在结构上运行操作后填充空值并且它没有问题),所以这个设置没有问题,直到我尝试释放内存 . 我偶尔会遇到运行时错误,可能有50%的时间 .

我真的不知道问题是什么,特别是当代码有时没有问题而且在其他问题上失败时 . 有人能引导我吗?

3 回答

  • 0

    在访问释放指向的内存之前,您需要检查NULL指针 .

    void ST_free(SymTab oSymTab)
    {
        if (oSymTab != NULL)
        {
            symEntry * current;
            symEntry * previous;
            current = oSymTab->head;
    
            while(current != NULL && current->next != NULL)
            {   
                previous = current;
                current= current->next;
                free(previous);
            }
            free(oSymTab);
        }
    }
    

    你还应该检查你malloc调用不返回NULL .

  • 0
    SymTab oSymTab = (SymTab)malloc(sizeof(SymTab));
    

    你应该使用struct指针:

    SymTab *oSymTab = (SymTab *)malloc(sizeof(SymTab));
    

    你的所有代码都使用SymTab,用SymTab替换它们*

  • 2

    所以...首先我要粘贴所有更正后的代码,之后我会给你一些错误:

    #include <stdlib.h>
    
    typedef struct symEntry symEntry;
    
    struct symEntry{
        const char * key;
        const void * value;
        struct symEntry * next;
        struct symEntry * linked;
        struct symEntry * previous;
    };
    
    typedef struct{
        symEntry* head;
        symEntry* tail;
        int size;
    } symTab;
    
    void ST_fill(symTab * oSymTab, int size)
    {
        symEntry * current;
        current = oSymTab->head;
    
        for(int i = 0; i < size-1; i++)
        {
             symEntry * entry = (symEntry *)malloc(sizeof(symEntry));
             entry->key = NULL;
             entry->value = NULL;
    
             entry->linked = NULL;
             entry->previous = current;
             current->next = entry;
             current = current->next;
        }
    
        current->next = NULL;
        oSymTab->tail = current;
     }
    
     symTab ST_new()
     {
         symTab * oSymTab = malloc(sizeof(symTab));
    
         int currentSize = 1;
         int sizeArray[currentSize];
    
         symEntry * head = (symEntry *)malloc(sizeof(symEntry));
         head->key = NULL;
         head->value = NULL;
         head->previous = NULL;
         head->linked = NULL;
    
         oSymTab->head = head;
         oSymTab->size = 0;
    
         ST_fill(oSymTab, sizeArray[currentSize]);
         return * oSymTab;
     }
    
     void ST_free(symTab * oSymTab)
     {
         symEntry * current;
         symEntry * previous;
         current = oSymTab->head;
    
         while(current->next != NULL)
         {
              previous = current;
              current= current->next;
              free(previous);
         }
    
         free(oSymTab);
     }
    
    • 你输错了一些变量(symTab - > SymTab)

    • 这些变量中的一些需要成为指针

    • 其中一些参数需要包含在你的函数头中

相关问题