Ошибка сегментации триггера функции загрузки
Я продолжаю получать segfault для моей функции загрузки.
bool load(const char *dictionary)
{
//create a trie data type
typedef struct node
{
bool is_word;
struct node *children[27]; //this is a pointer too!
}node;
//create a pointer to the root of the trie and never move this (use traversal *)
node *root = malloc(sizeof(node));
for(int i=0; i<27; i++)
{
//NULL point all indexes of root -> children
root -> children[i] = NULL;
}
FILE *dptr = fopen(dictionary, "r");
if(dptr == NULL)
{
printf("Could not open dictionary\n");
return false;
}
char *c = NULL;
//scan the file char by char until end and store it in c
while(fscanf(dptr,"%s",c) != EOF)
{
//in the beginning of every word, make a traversal pointer copy of root so we can always refer back to root
node *trav = root;
//repeat for every word
while ((*c) != '\0')
{
//convert char into array index
int alpha = (tolower(*c) - 97);
//if array element is pointing to NULL, i.e. it hasn't been open yet,
if(trav -> children[alpha] == NULL)
{
//then create a new node and point it with the previous pointer.
node *next_node = malloc(sizeof(node));
trav -> children[alpha] = next_node;
//quit if malloc returns null
if(next_node == NULL)
{
printf("Could not open dictionary");
return false;
}
}
else if (trav -> children[alpha] != NULL)
{
//if an already existing path, just go to it
trav = trav -> children[alpha];
}
}
//a word is loaded.
trav -> is_word = true;
}
//success
free(root);
return true;
}
Я проверил, правильно ли я указывал новые указатели на NULL во время инициализации. У меня есть три типа узлов: root, traversal (для перемещения) и next_node. (i.) Разрешено ли мне обнулять узлы перед тем, как их неправильно размещать? (ii.) Кроме того, как я могу освободить 'next_node', если этот узел инициализирован и размещен внутри оператора if? node *next_node = malloc(sizeof(node));
(iii.) Если я хочу установить узлы в качестве глобальных переменных, какие из них должны быть глобальными? (iv.) И наконец, где я могу установить глобальные переменные: внутри файла speller.c, вне его файла main или где-то еще? Это много вопросов, поэтому вам не нужно отвечать на все из них, но было бы неплохо, если бы вы могли ответить на все ответы! Пожалуйста, укажите любые другие особенности в моем коде. Там должно быть много. Я приму большинство ответов.
1 ответ
Причиной сбоя сегментации является указатель "c", которому вы не выделили память.
Также в вашей программе -
//scan the file char by char until end and store it in c
while(fscanf(dptr,"%s",c) != EOF)
Как только вы выделите память для указателя c, c будет содержать слово, прочитанное из файлового словаря. Ниже в вашем коде вы проверяете наличие символа '\0'
while ((*c) != '\0')
{
Но вы не перемещаете указатель c, чтобы указывать на следующий символ в прочитанной строке, из-за чего этот код будет выполнять бесконечный цикл while. Можете ли вы попробовать что-то вроде этого
char *tmp;
tmp = c;
while ((*tmp) != '\0')
{
......
......
//Below in the loop at appropriate place
tmp++;
}