2

行のサイズを知らなくても、一度に 1 行のテキスト ファイルの内容を取得して解析する関数を作成しています。行を取得して出力するだけであれば関数は機能しますが、別のローカル変数にメモリを割り当てようとするとすぐに glibc エラーが発生します。

glibc detected *** ./mention: realloc(): invalid next size: 0x00000000010ac250 ***

具体的には、SEARCH_LENGTH は 40 と定義されており、(char * word) を追加するとエラーが発生します。

void testF(FILE * stream){
    char * line = calloc(SEARCH_LENGTH , sizeof(char));
    int lineScalar = 1;

    char * word = calloc(SEARCH_LENGTH, sizeof(char)); // adding this line causes the error

    while(fgets(line, SEARCH_LENGTH + 1, stream)!= NULL){ 

            while((*(line + (SEARCH_LENGTH*lineScalar -1)) != '\0') && (*(line + (SEARCH_LENGTH*lineScalar -1)) !='\n')){
                lineScalar++;

                line = realloc(line, sizeof(char)*SEARCH_LENGTH*lineScalar);
                assert(line);

                fgets(line + SEARCH_LENGTH*(lineScalar - 1), SEARCH_LENGTH + 1, stream);

            }// inner while

            lineScalar = 1;
            printf("Line:%s\n",line);
        }


        free(line);
        free(word);
}

ありがとう

4

1 に答える 1

0

SEARCH_LENGTHに文字を割り当てますlineが、すぐfgets()に読み取ってもよいと伝えますSEARCH_LENGTH+1。その場合、ヒープが破損し、表示されている種類のエラー メッセージが正確に表示されます。fgets()ブロックの端を超えて書き込みを行わないでください。

于 2013-11-04T03:47:59.440 に答える