1

単語の配列を動的に割り当てる必要があります。単語は、空白文字の可変カウントで区切られたファイルに保存されます。ファイルに含まれる単語の数がわかりません。可変長にすることができます。

私はこのコードを持っています:

void readWord(FILE* stream, char *word, char first_c) {

    word[0] = first_c;
    char val;
    int wlen = 1;
    // isWhitespac is my function - tests if char is blank or '\n'
    while ((val = fgetc(stream)) != EOF && isWhitespace(val) == 0) {
        wlen++;
        word = realloc(word, (wlen+1) * sizeof (char));

        word[wlen-1] = val;    

    }
    word[wlen] = '\0';
}

int readList(const char *file) {

    FILE* f;
    char **arr;
    char val;
    int wcount = 0;

    arr = malloc(sizeof (char*));
    f = fopen(file, "r");

    while (fscanf(f, " %c", &val) == 1) {
        wcount++;
        arr = realloc(arr, wcount * sizeof (char *));

        arr[wcount - 1] = malloc(sizeof (char));  

        readWord(f, arr[wcount-1], val); 
        printf("%s\n", arr[wcount-1]);

    }


    for (int i = 0; i < wcount; ++i) {
        free(arr[i]);
    }

    free(arr);

    fclose(f);
    return 0;
}

それはうまく機能しているように見えます、それはすべての単語を印刷して読みます。しかし、Valgrindを使用してプログラムを実行すると、エラーが多すぎて見つけることができません。誰か助けてもらえますか?(mallocなどが正常に機能したかどうかをテストする必要があることはわかっています。これは単なるテスト機能です。)

Valgrindログはかなり長いですが、私も投稿する必要がありますか?

4

1 に答える 1

0

問題の1つは、readWord内でreallocを実行することです。reallocが新しいバッファーを割り当て、現在のバッファーを拡張するだけではない場合、コードはクラッシュし(ポインターを二重に解放します)、これがValgrindが取得するものです。これを修正するには、コードを書き直して、voidではなくポインタを返すようにします。

char * readWord(FILE* stream, char *word, char first_c) {
    word[0] = first_c;
    char val;
    int wlen = 1;
    // isWhitespac is my function - tests if char is blank or '\n'
    while ((val = fgetc(stream)) != EOF && isWhitespace(val) == 0) {
      wlen++;
      word = realloc(word, (wlen+1) * sizeof (char));
      word[wlen-1] = val;
    }
    word[wlen] = '\0';
    return word;
}

次に、readListのループを次のように変更します。

while (fscanf(f, " %c", &val) == 1) {
  wcount++;
  arr = realloc(arr, wcount * sizeof (char *));
  arr[wcount-1]=malloc(sizeof(char));
  arr[wcount - 1] = readWord(f, arr[wcount-1],  val);
  printf("%s\n", arr[wcount-1]);
}
于 2012-11-25T23:38:14.647 に答える