我正在尝试在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 回答
在访问释放指向的内存之前,您需要检查NULL指针 .
你还应该检查你malloc调用不返回NULL .
你应该使用struct指针:
你的所有代码都使用SymTab,用SymTab替换它们*
所以...首先我要粘贴所有更正后的代码,之后我会给你一些错误:
你输错了一些变量(symTab - > SymTab)
这些变量中的一些需要成为指针
其中一些参数需要包含在你的函数头中