Ошибка сегментации при вызове функции с двумерным массивом

У меня есть следующий код:

#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

Что я здесь не так делаю? Любая помощь будет высоко оценен.

2 ответа

Решение

Вы печатаете subband_t как большой двухмерный массив размером в несколько МБ. Для этого потребуется несколько МБ стековой памяти. Работает ли это, зависит от качества реализации. Есть ли в программе segfault для #define MAXSAMPLES 10? Тогда это твоя проблема.

И обратите внимание, что

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

никогда не работал и никогда не будет, потому что флаг EOF устанавливается только после того, как операция ввода достигнет EOF. Смотрите comp.lang.c FAQ.

Вы запутались в typedefs:

typedef sample_t sub_band_t[MAXSAMPLES][MAXSAMPLES];
  • Редактировать:

Вот пример для аналогичного вопроса: создать указатель на двумерный массив

Таким образом, похоже, что typedef верный, это может быть выделение такого количества памяти в стеке, все равно возникает ли ошибка, когда вы определяете MAXSAMPLES как 10? Также как он сказал, что есть проблема feof. И, как я уже прокомментировал, ваша функция получает 6 параметров, а вы отправляете только 5..

Другие вопросы по тегам