1

背景:Cでのポインターと動的メモリ割り当ての謎を解明しようとしています。ユーザーからいくつかの浮動小数点入力を取得し、動的に割り当てられてより多くの値に対応できるように拡張された配列に格納しようとしています。ユーザーが0を入力すると、ループが終了し、合計と平均が計算されて出力されます。BorlandC5.02を使用しています

問題:1。ループは4回しか機能せず、4番目の値が保存されません。
2. x +iをx[i]に置き換え、*(x + i-1)をx [i-1]に置き換えると、「浮動小数点エラー:スタック障害」「プログラムの異常終了」が発生します。

int main(void)
{
   float *x;
   float sum=0;
   float avg=0;
   int i=0;

   x=(float*)malloc(sizeof(float));

   do
   {
        scanf("%f",x+i);  //take input

      i++;
      x=(float*)realloc(x, i*sizeof(float));  //reallocate memory to store more values
      if(x==NULL){printf("WARNING");}

      printf("\n%f    %p   %d\n",*(x+i-1),x,i);

   }while(*(x+i-1)!=0);

   for(int j=0;j<i;j++)
   {sum=sum+*(x+j);} // Sum all values

   avg=sum/(i-1);   //Find result, i is 1 bigger than number of values, ith value is 0

   printf("\n\n%d   sum: %f   avg: %f ",i,sum,avg);
   getch();
   return 0;
}
4

2 に答える 2

10

iは0ベースなので、reallocは次のようになります 。x=(float*)realloc(x, (i+1)*sizeof(float));

于 2012-06-29T04:24:11.993 に答える
0

私はあなたのプログラムをコンパイルして実行しました。でビルドし-gてデバッグしてみました。このメッセージとスタックバックトレースが表示されます。

*** glibc detected *** ./a.out: realloc(): invalid next size: 0x0000000000797010 ***

私にとっては、6番目の数字の後で死にます。

上記の「次のサイズが無効です」というエラーメッセージを検索しましたが、本当に役立つものは見つかりませんでした。私が見つけたすべての答えは、基本的に「ヒープを破壊する何かをした」ですが、あなたのプログラムでは、それを行うべきものは何も見つかりません。

編集:さて、確かに、それは割り当てられたメモリの終了後に書き込みによって引き起こされたヒープの破損でした。それは私に教えてくれるはずです。メモリへの呼び出しとrealloc()書き込みが1か所ありました。バグはこれらの2行のうちの1つでなければなりませんでした!

于 2012-06-29T04:38:54.833 に答える