Утечка памяти в функции add - PullRequest
0 голосов
/ 27 мая 2018

Я пытался заставить мой код работать.Он компилируется, но когда я запускаю его, я получаю 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, поэтому любые советы будут с благодарностью.Заранее спасибо.

1 Ответ

0 голосов
/ 27 мая 2018

Я предполагаю, что путаница в понимании

typedef struct _tnode__ *Dict, TNode;

Это означает, что

Dict lookup;

совпадает с

TNode* lookup;

Так что, когда высоздаем словарь

void newdict(Dict* dp)

То же самое, что и

void newdict(TNode** dp)

Таким образом, при выделении выделение sizeof (Dict) совпадает с sizeof (TNode *), то есть sizeof указателя.Что действительно требуется, так это TNode.Обратите внимание - в C нет необходимости приводить malloc.Это требуется только для C ++.

*dp = malloc (sizeof(TNode));

Попробуйте и посмотрите, решит ли это вашу проблему.

...