0

好的,我整理了一个问题代码的简化示例:

#include "stdio.h"
#include "string.h"

struct Trie{
    //Holds sub-tries for letters a-z
    struct Trie *sub[26];
    //Is this a substring, or a complete word?
    int is_word;
};
typedef struct Trie Trie;

Trie dictionary;

int main(int argc, char *argv[]){
    //A list of words
    char *words[7] = {"the","of","and","to","a","in","that"};

    //Add the words to the Trie structure
    int i=0, wordlen;
    Trie *sub_dict;
    for (;i<7; i++){
        //Reset
        printf("NEW WORD\n");
        sub_dict = &dictionary;
        //Add a word to the dictionary
        int j=0, c;
        while (c = words[i][j], c != '\0'){
            printf("char = %c\n",c);
            //Initialize the sub-Trie
            if (sub_dict->sub[c-97] == NULL)
                sub_dict->sub[c-97] = (Trie*) malloc(sizeof(Trie*));
            //Set as new sub-trie
            sub_dict = sub_dict->sub[c-97];
            j++;
        }
        sub_dict->is_word = 1;
    }
}

基本上,我有一个 Trie 数据结构,其中包含字母“a”到“z”。我有一个应该添加到while循环中的单词列表。不幸的是,我在循环的不同点遇到了分段错误(取决于我何时运行它)。

我猜这个问题与这条线有关,
sub_dict->sub[c-97] = (Trie*) malloc(sizeof(Trie*));
但我是新手C,所以我完全不知道发生了什么。

4

2 回答 2

2

sub_dict->sub[c-97] = (Trie*) malloc(sizeof(Trie*)); 有错误。

sizeof(Trie*)在 32 位操作系统中将为 4,因为Trie*是指针,而在 32 位操作系统中指针的大小为 4。您可以这样做:sub_dict->sub[c-97] = (Trie*) malloc(sizeof(Trie));

于 2012-10-24T03:08:22.583 回答
1

你似乎认为当你这样做时

something = (Trie*) malloc(sizeof(Trie*));

然后该结构的内容被初始化为零(例如,每个成员都将作为 NULL 开始)。malloc()不是这种情况。您必须使用calloc或使用memset()在分配后重置它。

事实上,为了安全起见,我什至会在你的起始字典上调用 memset。(即使全局和静态变量显然已初始化为零,所以这对于您的情况可能不是必需的。)

于 2012-10-24T03:12:27.697 回答