我试图实现一个trie存储在C中的单词,但我在尝试访问一个struct成员时遇到分段错误。访问C中的struct成员时seg错误
的代码如下:
#include <stdbool.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define ALPHABET_SIZE 27
#define SIZE 45
//Trie data structure declaration
typedef struct _dictionary {
bool is_word;
char letter;
struct _dictionary *children[ALPHABET_SIZE];
} dicto;
dicto *DICT;
//Function prototypes
void insert(char *string);
int toIndex(char s);
int main() {
FILE *fp = fopen("small", "r");
if (fp == NULL) {
printf("Could not open file\n");
return 1;
}
char word[46];
while (fgets(word, sizeof(word), fp)) {
insert(word);
if (feof(fp)) {
return 0;
}
}
return 2;
}
//Inserts word into trie
void insert(char *string) {
dicto *trav; //Pointer to walk through the trie
trav = DICT;
for (int n = 0; n = strlen(string); n++) {
if (trav->children[toIndex(string[n])] == NULL) {
trav->children[toIndex(string[n])] = malloc(sizeof(DICT));
trav->letter = string[n];
trav = trav->children[toIndex(string[n])];
} else {
trav->letter = string[n];
trav = trav->children[toIndex(string[n])];
}
if (trav->letter == '\0') {
trav->is_word = true;
}
}
return;
}
/**
* Output alphabetic index from given input
*/
int toIndex(char s) {
s = toupper(s);
int index = s - 65;
return index;
}
我试着Valgrind
和GDB
调试它。从Valgrind的输出是:
==1979== Memcheck, a memory error detector
==1979== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==1979== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==1979== Command: ./test_function1
==1979==
==1979== Invalid read of size 4
==1979== at 0x8048684: insert (in /home/test_function1)
==1979== by 0x80485F7: main (in /home/test_function1)
==1979== Address 0xffffff00 is not stack'd, malloc'd or (recently) free'd
==1979==
==1979==
==1979== Process terminating with default action of signal 11 (SIGSEGV)
==1979== Access not within mapped region at address 0xFFFFFF00
==1979== at 0x8048684: insert (in /home/test_function1)
==1979== by 0x80485F7: main (in /home/test_function1)
==1979== If you believe this happened as a result of a stack
==1979== overflow in your program's main thread (unlikely but
==1979== possible), you can try to increase the size of the
==1979== main thread stack using the --main-stacksize= flag.
==1979== The main thread stack size used in this run was 8388608.
==1979==
==1979== HEAP SUMMARY:
==1979== in use at exit: 344 bytes in 1 blocks
==1979== total heap usage: 2 allocs, 1 frees, 4,440 bytes allocated
==1979==
==1979== LEAK SUMMARY:
==1979== definitely lost: 0 bytes in 0 blocks
==1979== indirectly lost: 0 bytes in 0 blocks
==1979== possibly lost: 0 bytes in 0 blocks
==1979== still reachable: 344 bytes in 1 blocks
==1979== suppressed: 0 bytes in 0 blocks
==1979== Reachable blocks (those to which a pointer was found) are not shown.
==1979== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==1979==
==1979== For counts of detected and suppressed errors, rerun with: -v
==1979== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
Segmentation fault (core dumped)
,并通过运行GDB,貌似错误来自行54:
if (trav->children[toIndex(string[n])] == NULL)
什么可能发生的任何想法。
'trav'是'DICT'('绝对判断* DICT;')。它是'NULL'。还有'for(int n = 0; n = strlen(string); n ++)' - >'for(int n = 0; n
BLUEPIXY