0

以下の関数は、リンクリスト上の文字列を昇順で並べ替えようとします。新しいリストを返すと、破損します。

void* order( void *ptr){
    struct wordlist *head;
    head = (struct wordlist *) ptr;

    struct wordlist *first = (struct wordlist*)malloc(sizeof(struct wordlist));
    struct wordlist *second = (struct wordlist*)malloc(sizeof(struct wordlist));
    struct wordlist *temp = (struct wordlist*)malloc(sizeof(struct wordlist));

    first = head;

    int j = 1;
    while( first != NULL){
        second = first->next;

        while( second != NULL){
            if( strcmp( first->word, second->word) > 0){
                if( temp->word == NULL){
                    temp->word = malloc( sizeof(first->word));
                }
                else{
                    if( realloc( temp->word, sizeof( first->word)) != NULL){
                        strcpy( temp->word, first->word);
                    }
                }

                if( realloc( first->word, sizeof(second->word)) != NULL){
                    strcpy( first->word, second->word);
                }

                if( realloc( second->word, sizeof(temp->word)) != NULL){
                    strcpy( second->word, temp->word);
                }

                free(temp);
            }
            second = second->next;
        }
        j++;
        first = first->next;
    }
}

たとえば、入力が

piero
ronaldo
messi

その場合、出力は次のようになります

messi
ŽŽŽ
ronaldo

上記の例はコードでは試されていませんが、手がかりが得られます。メモリの割り当てに何かがあると思いますが、なんとか見つけることができませんでした。ちなみに、言葉も空っぽになることがあります。

また、ワードリストは次のとおりです。

struct wordlist{
    char *word;
    struct wordlist *next;
};
4

1 に答える 1

1

初めて文字列を一時的なものにコピーすることはありません。

            if( temp->word == NULL){
                temp->word = malloc( sizeof(first->word));
                // You forgot to copy!!
            }
            else{
                if( realloc( temp->word, sizeof( first->word)) != NULL){
                    strcpy( temp->word, first->word);
                }
            }

を参照してください。これtemp->wordが初めての場合(実際には構造体をクリアしないため、未定義の動作が発生することに注意してください、コピーしません。手っ取り早い解決策は、あなたの後に行うことです。NULLtempstrcpymalloc

あなたのrealloc電話はすべて間違っています。sizeof文字列のサイズを取得するために使用することはできません。そのために使用strlenし、文字列ターミネータ用にバイトを追加することを忘れないでください。

さらに、とを割り当てないでfirstくださいsecond。これらは、データ構造のイテレータです。最初に行うことは、それらの値を破棄してメモリをリークすることです。その後だけでなく、freeあなたのtemp構造を忘れないでください。temp->word

mallocあなたがそれを動かした後、これとstrcpyビジネスをすべて止めてください!!!

文字列を移動するには、ポインタを移動するだけです。再割り当てやコピーは必要ありません。これにより、コードが数行に簡略化されます。

ああ、そしてあなたもreturnあなたの関数からの価値を忘れましたか?

于 2013-03-27T02:28:07.100 に答える