1

入力として配列を受け取り、出力として2つの配列を与える関数をCで記述しています。この関数は、引数として渡される配列に書き込みます。メモリエラーを防ぐための「フェイルセーフ」として、関数に渡されたポインタが有効なメモリアドレスであるかどうかを確認し、有効な場合は解放します。これが私がこれまでに持っているコードですが、私がまだスタブアウトについて確信が持てない部分があります:

int fft( double* signal, double* real, double* imag, int size ) {
    double retVal;

    /*initialize output arrays*/
    if( /*real is a valid memory address */ ) {
        free( real );
    }

real解放しようとしたときにセグメンテーション違反が発生しない有効なメモリアドレスであることを確認するにはどうすればよいですか?

4

2 に答える 2

2

それに対する唯一の答えがあります:あなたはできません。

有効なポインタの場合は、有効なアドレスを指します。メモリのブロックがヒープに割り当てられているかどうかを判断する標準的な方法はありません。

唯一の解決策は、ポインタがヒープに割り当てられたメモリブロックを指しているという引数が必要なことです。またはさらに良いことに、関数の呼び出し元に、呼び出し元が割り当てたメモリを解放させます。

于 2013-03-24T17:09:32.943 に答える
1

ポインタへの書き込みアクセス権があるかどうかを確認できる場合があります。たとえば、WindowsではIsBadWritePtr関数を使用できます。

この関数は廃止されており、スレッドセーフではないため、使用をお勧めしません。「使用しないでください」と読むことができます。

また、任意のアドレスを解放することはできません。使用するメモリ割り当てがOSが使用するものと同じであるかどうかを確認することはできません。malloc/ realloccall以外のアドレスを解放することはできません。

あなたの場合、WinAPIガイドラインに従うのが良いでしょう:サイズのある2つのポインタが必要です。結果の余地がない場合は、エラーコードを返します。または、ポインタへの2つのポインタを要求してから、自分でメモリを割り当て、データを返し、呼び出し元がメモリを解放する必要があることを指定することもできます。

int fft( double* signal, double** real, double** imag, int size ) {
   int retval_size = 256;
   *real = (double*)malloc(sizeof(double) * retval_size);
   *imag = (double*)malloc(sizeof(double) * retval_size);
   ...
}
于 2013-03-24T17:22:17.463 に答える