0

私は次のコードを持っています:

#define MAXSAMPLES 1024
typedef  int sample_t;
typedef sample_t sub_band_t[MAXSAMPLES][MAXSAMPLES];

void blah(sample_t a[][MAXSAMPLES], int u0, int v0, int u1, int v1) {
. . . . 
} 


int main(int argc, char *argv[]) {
    sub_band_t in_data;
    int k =0;

    if (argc < 2) {
        printf("\nInput filename required\n");
        return 0;
    }

    FILE *input_file = fopen(argv[1], "r");
    char del = '\0';

    int i = 0, j = 0;
    int cols = 0;
    sample_t x;
    while (! feof(input_file)) {
        if (fscanf(input_file, "%d%c", &x, &del) != 2) {
            i--;
            break;
        }
        in_data[i][j] = x;
        if ( del == '\n') {
            i++;
            j =0;
            continue;
        }
        j++;
        cols = j > cols ? j : cols;
        x = 0;
    }
    blah(in_data, 0, 0, i, cols);
}

10 * 10の整数の入力ファイルを使用してこのプログラムを実行するblahと、mainの関数呼び出しでセグメンテーション違反が発生します。gdbを使用してセグメンテーション違反に関する情報を収集することもできません。

0x0000000000400928 in blah (a=Cannot access memory at address 0x7ffffdbfe198) at blah.c

私はここで何が間違っているのですか?どんな助けでも大歓迎です。

4

2 に答える 2

1

subband_t数MBの大きな2次元配列としてtypedefを実行します。これには、数MBのスタックメモリが必要になります。それが機能するかどうかは、実装の品質の問題です。プログラムはセグメンテーション違反#define MAXSAMPLES 10ですか?それがあなたの問題です。

そして、それに注意してください

 while (! feof(input_file)) { ... }

EOFフラグは、入力操作がEOFにヒットした後にのみ設定されるため、機能したことはなく、機能することもありません。comp.lang.cのFAQを参照してください。

于 2013-03-25T11:01:42.807 に答える
1

あなたはtypedefで混乱しました:あなたはしました:

typedef sample_t sub_band_t[MAXSAMPLES][MAXSAMPLES];
  • 編集:

同様の質問の例がここにあります: 2次元配列へのポインターを作成します

したがって、typedefは正しいように見えます。これは、スタックに大量のメモリが割り当てられている可能性がありますが、MAXSAMPLESを10として定義した場合でも、セグメンテーション違反になりますか?また、彼が言ったように、feofの問題があります。そして、私がコメントしたように、あなたの関数は6つのパラメーターを受信するように見え、5つだけを送信します。

于 2013-03-25T11:04:42.630 に答える