我试图在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);
}
如果我注释掉两个free语句,代码运行时不会出现问题(我在用空值填充结构后对其运行了操作,它没有任何问题(,所以在我尝试释放内存之前,此设置没有任何问题。我偶尔会出现运行时错误,可能有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调用是否返回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(
- 其中一些变量需要成为指针
- 其中一些参数需要包含在函数的头部中