root->child[z] = (struct trie *)malloc(sizeof(struct trie));
root->child[z]->letter=word[i];
root->child[z]=root;
Это проблематично.
1) Что, если child[z]
уже был установлен?
2) Вы никогда не устанавливали child[z]->child
или child[z]->count
на что-либо
# 2вызывая ваши ошибки, # 1 - утечка памяти.
Мое решение было бы написать функцию для выделения новых потомков:
struct trie* newtrie(char newchar) {
struct trie* r = malloc(sizeof(struct trie));
memset(r, 0, sizeof(struct trie));
r->letter = newchar;
return r;
}
Тогда ваш код станет:
if (root->child[z] == NULL)
root->child[z] = newtrie(word[i]);
root->child[z]=root;
Вы также должны изменить malloc root:
struct trie *root = newtrie(0);
Что более понятно и позволяет избежать ошибок, о которых я упоминал.http://codepad.org/J6oFQJMb Никаких ошибок по умолчанию после 6 или около того вызовов.
Я также заметил, что ваш код malloc
sa новый root
, но никогда не возвращает его, поэтому никто, кроме этой функции, никогда не сможет увидетьЭто.Это также утечка памяти.