0

私は宣言したところでこのプログラムを行いました

long double *M;

次に、ファイルからデータを読み取ります

   i=1;
   M = (long double *) calloc ( i , sizeof(long double) );
   while ( !feof( arq_matriz ) ){ 
       fscanf ( arq_matriz , "%Lf" , (M+i-1));
       i++;
       M = (long double *) realloc ( M , i * sizeof(long double) );
   }
   fclose(arq_matriz);

だから、テストするために私はそれを画面に印刷します

for (i=0;i<=44;i++){
    printf("\n %Lf",*(M+i));
}

すべて完璧。しかし、関数に渡したとき、またはデバッグしたときでさえ、*M=0 を取得しましたが、真実は *M = 0.25 および *(M+1) = '無効な浮動小数点数' です。すべてが画面に正しく印刷されているため、なぜこれが起こっているのかわかりません。ヒントはありますか?ありがとう!

4

1 に答える 1

1

ループに参加しようとしていますがrealloc、正しく実行していません。realloc失敗すると、nullポインタが返されます。これをに直接割り当てるのでM、その時点で元のポインタが失われ(メモリがリークします)、それがnullポインタであるかどうかを確認しないため、書き込みを続行し、失敗した場合に未定義の動作を引き起こします。

おそらく目前の問題とは関係ありませんが、のようなループwhile (!feof(somefile))はほぼ確実に誤動作します(通常、ファイルの最後の項目を2回読み取るように見えます)。

于 2012-05-30T06:28:49.553 に答える