C trie add函数中的内存泄漏
我一直在努力让我的代码正常工作。它可以编译,但当我运行它时,我得到一个segfault,gdb和valgrind特别指向这一行,我的问题是我真的不知道如何修复它:C trie add函数中的内存泄漏,c,memory-leaks,malloc,valgrind,trie,C,Memory Leaks,Malloc,Valgrind,Trie,我一直在努力让我的代码正常工作。它可以编译,但当我运行它时,我得到一个segfault,gdb和valgrind特别指向这一行,我的问题是我真的不知道如何修复它: if (!pCrawl->cvec[index]) { 它位于addword()中。 本质上,我应该在trie数据结构的头文件中实现函数:makedictionary、add、search和delete 以下是学校提供的头文件: #define VECSIZE ('z'-'a' + 1) typedef char *
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)((int)c-(int)“a”)
无效新词(Dict*dp){
*dp=NULL;
dp=(Dict*)malloc(sizeof(Dict));
如果(dp){
int i;
(*dp)->eow=假;
对于(i=0;icvec[i]=NULL;
}
}
}
无效添加字(常量字r,常量字w){
智力水平;
整数长度=strlen(w);
整数指数;
Dict pCrawl=r;
printf(“第1行\n”);
用于(级别=0;级别<长度;级别++){
索引=字符到索引(w[级别]);
如果(!pCrawl->cvec[索引]){
newdict(&(pCrawl->cvec[index]);
}
pCrawl=pCrawl->cvec[索引];
}
pCrawl->eow=真;
}
布尔校验字(常量字r,常量字w){
智力水平;
整数长度=strlen(w);
整数指数;
Dict pCrawl=r;
用于(级别=0;级别<长度;级别++){
索引=字符到索引(w[级别]);
如果(!pCrawl->cvec[索引]){
返回FALSE;
}
pCrawl=pCrawl->cvec[索引];
}
如果(pCrawl!=NULL&&pCrawl->eow){
返回TRUE;
}否则{
返回FALSE;
}
}
我对C有点陌生,所以任何提示都将不胜感激。提前谢谢。我猜困惑在于理解
typedef struct _tnode__ *Dict, TNode;
这意味着
Dict lookup;
与
TNode* lookup;
void newdict(TNode** dp)
所以当你创建字典的时候
void newdict(Dict* dp)
与
TNode* lookup;
void newdict(TNode** dp)
因此,在分配时,分配sizeof(Dict)与sizeof(TNode*)相同,即指针的sizeof。真正需要的是一个TNode。注意-在C中,不需要强制转换mallocs。它只需要C+++< /p>
*dp = malloc (sizeof(TNode));
试试看它是否能解决您的问题。传递给addword的单词w中是否有除小写英文字母以外的字符?单词w应该代表任何小写的单词。newdict的前三行看起来完全错误。这不是分配数据结构的方式。请在您的帖子中包含一个包含所有类型定义和包含指令的函数。当出现segfault时,word的确切值是多少?我认为w的值不太可能是问题所在-如果没有这些函数如何使用的完整示例,就无法判断,但我怀疑由于newdict,pCrawl在该行可能为空。非常感谢,你的解释起了奇效。我不仅能够开始工作,而且我更了解我的小困境,因为指针不是我的东西。