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

Runtime Errors When Using Free() in C

我正在尝试使用 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;

我的问题是当我试图释放我分配的内存时。我分配了所有这些和 return 列表的结构,如下所示:

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);
}

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

我真的不知道问题出在哪里,尤其是当代码 运行 有时没有问题而有时失败时。有人能指导我吗?

您需要在访问或释放指向的内存之前检查 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 调用是否 return NULL。

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

你应该使用结构指针:

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

您所有的代码都使用了 SymTab,将它们替换为 SymTab *

所以...首先我将粘贴您所有更正的代码,然后我会标记您的一些错误:

#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)
  • 其中一些变量需要是指针
  • 其中一些是需要包含在函数头部的参数