分割故障,初始化C中的递归结构



好吧,我汇总了问题代码的简化示例:

#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 WORDn");
        sub_dict = &dictionary;
        //Add a word to the dictionary
        int j=0, c;
        while (c = words[i][j], c != ''){
            printf("char = %cn",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的新手,所以我绝对不知道发生了什么。

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

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

您似乎假定当您做

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

然后将该结构的内容初始化为零(例如,每个成员都以null的速度启动)。Malloc()并非如此。您必须使用calloc,或使用memset()在分配后重置它。

实际上,即使在您的启动字典上,我也会称Memset为安全的一面。(即使全局和静态变量显然是初始化为零的,因此对于您的情况来说可能不是必需的。)

相关内容

  • 没有找到相关文章

最新更新