添加函数中的 C trie 内存泄漏
C trie memory leak in add function
我一直在努力让我的代码正常工作。它编译但是当我 运行 它时我得到一个段错误并且 gdb 和 valgrind 特别指向这一行我的问题是我真的不知道如何修复它:
if (!pCrawl->cvec[index]) {
在 addword() 中。
本质上我应该在 trie 数据结构的头文件中实现函数:makedictionary、add、search 和 delete。
这是学校提供的头文件:
#define VECSIZE ('z'-'a' + 1)
typedef char *word;
enum __bool__ { FALSE, TRUE };
typedef enum __bool__ bool;
typedef struct __tnode__ *Dict, TNode;
struct __tnode__ {
Dict cvec[VECSIZE];
bool eow;
};
void newdict(Dict *dp);
void addword (const Dict r, const word w);
bool checkword (const Dict r, const word w);
void delword (const Dict r, const word w);
void barf(char *s);
也不是因为我不能更改头文件,而且 bool 是一个 typedef,所以我不能使用 stdbool.h。
这是我正在编写的 C 代码:
#define CHAR_TO_INDEX(c) ((int)c - (int)'a')
void newdict (Dict *dp) {
*dp = NULL;
dp = (Dict *)malloc(sizeof(Dict));
if (dp) {
int i;
(*dp)->eow = FALSE;
for (i = 0; i < VECSIZE; i++) {
(*dp)->cvec[i] = NULL;
}
}
}
void addword (const Dict r, const word w) {
int level;
int length = strlen(w);
int index;
Dict pCrawl = r;
printf("line 1\n");
for (level = 0; level < length; level++) {
index = CHAR_TO_INDEX(w[level]);
if (!pCrawl->cvec[index]) {
newdict(&(pCrawl->cvec[index]));
}
pCrawl = pCrawl->cvec[index];
}
pCrawl->eow = TRUE;
}
bool checkword (const Dict r, const word w) {
int level;
int length = strlen(w);
int index;
Dict pCrawl = r;
for (level = 0; level < length; level++) {
index = CHAR_TO_INDEX(w[level]);
if (!pCrawl->cvec[index]) {
return FALSE;
}
pCrawl = pCrawl->cvec[index];
}
if (pCrawl != NULL && pCrawl->eow) {
return TRUE;
} else {
return FALSE;
}
}
我对 C 有点陌生,所以任何提示都将不胜感激。提前致谢。
我猜是理解上的困惑
typedef struct _tnode__ *Dict, TNode;
这意味着
Dict lookup;
与
相同
TNode* lookup;
所以当你创建字典时
void newdict(Dict* dp)
与
相同
void newdict(TNode** dp)
所以在分配的时候,分配sizeof(Dict)和sizeof(TNode*)是一样的,也就是指针的sizeof。真正需要的是一个 TNode。注意 - 在 C 中不需要转换 mallocs。只有 C++ 需要它。
*dp = malloc (sizeof(TNode));
尝试一下,看看是否能解决您的问题。
我一直在努力让我的代码正常工作。它编译但是当我 运行 它时我得到一个段错误并且 gdb 和 valgrind 特别指向这一行我的问题是我真的不知道如何修复它:
if (!pCrawl->cvec[index]) {
在 addword() 中。 本质上我应该在 trie 数据结构的头文件中实现函数:makedictionary、add、search 和 delete。
这是学校提供的头文件:
#define VECSIZE ('z'-'a' + 1)
typedef char *word;
enum __bool__ { FALSE, TRUE };
typedef enum __bool__ bool;
typedef struct __tnode__ *Dict, TNode;
struct __tnode__ {
Dict cvec[VECSIZE];
bool eow;
};
void newdict(Dict *dp);
void addword (const Dict r, const word w);
bool checkword (const Dict r, const word w);
void delword (const Dict r, const word w);
void barf(char *s);
也不是因为我不能更改头文件,而且 bool 是一个 typedef,所以我不能使用 stdbool.h。 这是我正在编写的 C 代码:
#define CHAR_TO_INDEX(c) ((int)c - (int)'a')
void newdict (Dict *dp) {
*dp = NULL;
dp = (Dict *)malloc(sizeof(Dict));
if (dp) {
int i;
(*dp)->eow = FALSE;
for (i = 0; i < VECSIZE; i++) {
(*dp)->cvec[i] = NULL;
}
}
}
void addword (const Dict r, const word w) {
int level;
int length = strlen(w);
int index;
Dict pCrawl = r;
printf("line 1\n");
for (level = 0; level < length; level++) {
index = CHAR_TO_INDEX(w[level]);
if (!pCrawl->cvec[index]) {
newdict(&(pCrawl->cvec[index]));
}
pCrawl = pCrawl->cvec[index];
}
pCrawl->eow = TRUE;
}
bool checkword (const Dict r, const word w) {
int level;
int length = strlen(w);
int index;
Dict pCrawl = r;
for (level = 0; level < length; level++) {
index = CHAR_TO_INDEX(w[level]);
if (!pCrawl->cvec[index]) {
return FALSE;
}
pCrawl = pCrawl->cvec[index];
}
if (pCrawl != NULL && pCrawl->eow) {
return TRUE;
} else {
return FALSE;
}
}
我对 C 有点陌生,所以任何提示都将不胜感激。提前致谢。
我猜是理解上的困惑
typedef struct _tnode__ *Dict, TNode;
这意味着
Dict lookup;
与
相同TNode* lookup;
所以当你创建字典时
void newdict(Dict* dp)
与
相同void newdict(TNode** dp)
所以在分配的时候,分配sizeof(Dict)和sizeof(TNode*)是一样的,也就是指针的sizeof。真正需要的是一个 TNode。注意 - 在 C 中不需要转换 mallocs。只有 C++ 需要它。
*dp = malloc (sizeof(TNode));
尝试一下,看看是否能解决您的问题。