1

コードに問題があります。お役に立てば幸いです。奇数を入力すると、セグメンテーション違反が発生し、偶数の場合はバス エラーが発生します。データ配列に 00 を追加して、長さ Nprime から入力した新しいより大きな長さ Ndprime にしようとしています。関数 *fpad でこれを行っています。私の paddata 配列には Nprime 複素数 (つまり 2*Nprime コンポーネント) が含まれており、2*Ndprime のサイズにする必要があります。

double *fpad(double *paddata, unsigned int Nprime, unsigned int Ndprime)
{   
   if (Nprime!=Ndprime)
   {
       paddata=(double*)realloc(paddata,(sizeof(double)*((2*Ndprime)-1)));

       for(i>=((2*Nprime));i<(2*Ndprime);i++) paddata[i]=0;  

       if(paddata==NULL)              /* Checks memory is reallocated */
       {
           printf("\nError reallocating memory.\n");
           free(paddata);
           exit(EXIT_FAILURE);
       } 
    }
  return(paddata);  
}

助けていただければ幸いです。何が間違っているのかわかりません。

4

2 に答える 2

1

宣言されていない変数を使用していますi(またはグローバル変数である可能性があります)。

for(i>=((2*Nprime));i<(2*Ndprime);i++) paddata[i]=0;

i最初の条件は、 がより小さいか大きいかをチェックします2*Nprime(ただし、 は設定しませんi)。次に、この適切に初期化されていない値を使用して配列にアクセスし、i負になる可能性があり、問題が発生する可能性があります。

上記で問題があると診断されたループの後で、メモリの再割り当てが成功したかどうかのみを確認します。メモリ割り当てが失敗した場合、この関数でポインタの元のコピーを慎重にザッピングしました。ヌル ポインターを解放しても意味がありませんが、割り当ての失敗で終了するため、それほど大きな問題はありません。

初期化ループをメモリ チェックの後に配置します。括弧の数がわずかに少なくなります。

for (int i = 2*Nprime; i < 2*Ndprime; i++)  // C99 (and C++)
    paddata[i] = 0.0;

C99表記が使えない場合int i;は、関数内で宣言してください。

という名前のグローバル変数を作成しないでくださいi

コンパイラの警告に注意してください。「効果のないステートメント」について警告していない場合は、十分な警告をオンにしていません。

于 2012-11-09T00:22:57.427 に答える
0

動的配列を初期化するには、関数memset関数をお勧めします。「for」ステートメントのインデックス「i」は、0〜2*Ndprime-2の範囲である必要があると思います。

于 2012-11-09T00:38:10.893 に答える