C trie add函数中的内存泄漏

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 *

我一直在努力让我的代码正常工作。它可以编译,但当我运行它时,我得到一个segfault,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)((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在该行可能为空。非常感谢,你的解释起了奇效。我不仅能够开始工作,而且我更了解我的小困境,因为指针不是我的东西。