2017-07-27 8 views
0

私はAVL木のための2つの変数を格納するために必要されたプロジェクトがあります。それが使用されていることを言葉やレート:AVL木のためのCの文字列を格納する

struct AVLnodo { 
    float peso; 
    int FB; 
    char *palavra; 
    struct AVLnodo* esq; 
    struct AVLnodo* dir; 
}; 

注:

ペソ=利用率

palavra =ワード

他の変数は、子と因子のバランスのポインタです。

問題は、以下のコードである:

wordTree* InsereAVL (wordTree *a, float peso, char *word, int *ok) 
{ 
if (a == NULL) 
    { 
    a = (wordTree*) malloc(sizeof(wordTree)); 
    a->peso = peso; 
    a->palavra = NULL; 

    //1-----> strcpy(a->palavra,word); 
    //2-----> a->palavra=word; 

    a->esq = NULL; 
    a->dir = NULL; 
    a->FB = 0; 
    *ok = 1; 
} 
else 
if (peso < a->peso) 
{ 
     ... 
} 
else 
{ 
     ... 
} 
return a; 
} 

1で示すように、文字列をコピーする正しい方法は、strcpyのを使用することであるが、それは、実行エラーが発生します。

2を使用するとコードは機能しますが、各ノードの構造体のワードフィールドは同じアドレスで保存されます。つまり、すべてのノードのペーソ(使用率)は異なりますが、 (単語)は、ツリーに追加された最後の単語です。

この問題を解決する方法がわかりません。うまくいけば誰かがそれを修正する方法を知っているだろう。

ありがとうございました。

+1

'a-> palavra = NULL; strcpy(a-> palavra、word); '悪いです。 'a-> palavra 'に割り当てられたメモリはありません。 'a-> palavra = strdup(word);'を提案してください。あなたは後で '自由(a-> palavra)'を行う責任があります。 –

+0

"文字列をコピーする正しい方法はstrcpyを使用することです"はい、コピーします*どこに*?最初にコピーを保持するためのメモリが必要であり、それは(AVL)ツリー上で成長しません。 –

+0

'a =(wordTree *)malloc(sizeof(wordTree)); 'を使うと文字列のメモリも割り当てられていると思っていましたが、今これを修正しました。 ありがとう –

答えて

3

あなたは、単語をコピーする前にメモリを割り当てる必要があります。

a->palavra = malloc(strlen(word)+1);

+0

私はこれを実行した! 'a =(wordTree *)malloc(sizeof(wordTree)); を使用しましたが、 は文字列フィールドにもメモリを割り当てると考えました。 –

+0

'malloc(sizeof(wordTree));'は構造体に十分なメモリしか割り当てません。ポインタは、参照する型とは異なる型を表します。 Variosアーキテクチャでは、ポインタのサイズが異なることに注意してください。 –

1

私はあなたがa->palavraにstrcpyの前にメモリををmallocする必要があると思います。

関連する問題