Ошибка сегментации при чтении текстового файла

При чтении текстового файла вылезает ошибка сегментации:

Signal: SIGSEGV (Segmentation fault)

К тому же если поменять fscanf на scanf и вводить числа через консоль, то происходит тоже самое. Хотя это обычные переменные, а не указатели на них.
Сам код:

#include <stdio.h>
#include <math.h>
#include <malloc.h>

struct complex {
    double real, imag;
};


void print_nulls(int c) {
    for (int i = 0; i < c; i++) {
        printf("%14d ", 0);
    }
}

void Print(int m_arr[], int size_m, struct complex *a_arr[], int size_a, int m) {
    int i_m = 0;
    printf("DEFAULT MATRIX\n");
    for (int i = 0; i < size_a; i += 2) {
        if (m_arr[i_m] == 0) {
            print_nulls(m);
            ++i_m;
            continue;
        }
        if (i == m_arr[i_m]) {
            print_nulls((int) a_arr[i]->real - 1);
            ++i_m;
        } else {
            print_nulls((int) a_arr[i]->real - (int) a_arr[i - 2]->real - 1);
        }
        printf("%1.2f + %1.2f*i ", a_arr[i + 1]->real, a_arr[i + 1]->imag);
    }
    printf("FIXED MATRIX\nARRAY M\n");
    for (int i = 0; i < size_m; i++) {
        printf("%d ", m_arr[i]);
    }
    printf("ARRAY A\n");
    for (int i = 0; i < size_a; i++) {
        if (i % 2) {
            printf("%1.2f + %1.2f*i ", a_arr[i]->real, a_arr[i]->imag);
        } else {
            printf("%d ", (int) a_arr[i]->real);
        }
    }
    printf("\n");
}


int main() {
    FILE *f = fopen("in.txt", "r");
    if (f == NULL) {
        printf("INVALID INPUT\n");
        return 0;
    }
    int *m_arr;
    struct complex **a_arr;
    int n, m;
    int i_a = 0, i_m = 0;
    while (!feof(f)) {
        scanf("%d %d", n, m); // ошибка происходит на этой строчке
        m_arr = (int *) malloc(m * sizeof(int));
        a_arr = (struct complex **) malloc(n * m * 2 * sizeof(struct complex));
        for (int i = 0; i < n; i++) {
            int bool_ch = 0;
            for (int j = 0; j < m; j++) {
                double real, imag;
                fscanf(f, "%f %f", real, imag);
                if (real || imag) {
                    if (!bool_ch) {
                        m_arr[i_m++] = i_a;
                    }
                    bool_ch = 1;
                    a_arr[i_a]->real = j, a_arr[i_a++]->imag = 0;
                    a_arr[i_a]->real = real, a_arr[i_a++]->imag = imag;
                }
            }
            if (!bool_ch) m_arr[i_m++] = 0;
        }
    }
    fclose(f);
    int size_a = i_a, size_m = i_m;
    Print(m_arr, size_m, a_arr, size_a, m);
    int colums[100], size = 0;
    struct complex *del;
    del->real = 0, del->imag = 0;
    i_m = 0;
    float mod = 0;
    for (int i = 0; i < size_a; i += 2) {
        if (a_arr[i]->real == m_arr[i_m]) {
            i_m++;
        }
        if (mod < sqrt(pow(a_arr[i]->real, 2) + pow(a_arr[i]->imag, 2))) {
            for (int j = 0; j < size; j++) {
                colums[j] = 0;
            }
            colums[0] = i_m, size = 1;
            mod = sqrt(pow(a_arr[i]->real, 2) + pow(a_arr[i]->imag, 2));
            del = a_arr[i];
        } else if (mod == sqrt(pow(a_arr[i]->real, 2) + pow(a_arr[i]->imag, 2))) {
            colums[size++] = i_m;
        }
    }
    for (int i = 0; i < size; i++) {
        int graniza = -1;
        if (colums[i] == m) {
            graniza = size_a;
        } else {
            graniza = m_arr[colums[i]];
        }
        for (int j = m_arr[colums[i] - 1]; j < graniza; j += 2) {
            struct complex ch = *a_arr[j + 1];
            a_arr[j + 1]->real = (ch.real * del->real + ch.imag * del->imag) /
                                 ((pow(del->real, 2) + pow(del->imag, 2)));
            a_arr[j + 1]->imag = (ch.imag * del->real - ch.real * del->imag) /
                                 ((pow(del->real, 2) + pow(del->imag, 2)));
        }
    }
    Print(m_arr, size_m, a_arr, size_a, m);
    free(m_arr);
    for (int i = 0; i < n * m * 2; i++) {
        free(a_arr[i]);
    }
    free(a_arr);
    return 0;
}

Ответы (0 шт):