在 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)
- 其中一些变量需要是指针
- 其中一些是需要包含在函数头部的参数
我正在尝试使用 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)
- 其中一些变量需要是指针
- 其中一些是需要包含在函数头部的参数