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;
    }
}

基本的に、私は文字「a」から「z」を保持するTrieデータ構造を持っています。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*)Trie*はポインターであり、32 ビット OS でのポインターのサイズは4 であるため、32 ビット OS では 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 に答える