Ошибка сегментации, когда я использую двойные указатели в C для поиска определителя массива

#arrays #c #pointers

Вопрос:

Я пытаюсь написать код на C, который вычисляет определитель заданной матрицы n * n, но в итоге я получаю ошибку сегментации в функции get_subarray, даже если я нигде не превысил последний индекс.

 #include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>

#define ll long long

void print_2d(int **arr, int n){
    for(int i = 0; i < n; i  ){
        for(int j = 0; j < n; j  ){
            printf("%d ", arr[i][j]);
        }
        printf("n");
    }
    printf("nn");
}

ll base_case(int **arr, int n){
    //for n = 2
    ll res = arr[0][0] * arr[1][1] - arr[1][0] * arr[0][1];

    return res;
}

void get_subarray(int **arr, int **sub_arr, int n, int col){
    int i = 0, j = 0;

    // print_2d(arr, n);

    for(int k = 1; k < n; k  ){
        j = 0;
        
        for(int m = 0; m < n; m  ){

            if(m != col amp;amp; j < n - 1 amp;amp; i < n - 1){
                // printf("%d %dt%d %dn", i, j, k, m);
                sub_arr[i][j] = arr[k][m];
                j  ;
            }

        }
        i  ;
        // printf("n");
    }
}

ll get_determinant(int **arr, int n){

    if(n == 2){
        return base_case(arr, n); 
    }

    ll det = 0;
    ll tmp;

    for(int i = 0; i < n; i  ){        
        int **sub_arr = (int**)malloc((n - 1) * sizeof(int *));

        for(int j = 0; j < n - 1; j  ){
            sub_arr[i] = (int*) malloc((n - 1) * sizeof(int));
        }

        get_subarray(arr, sub_arr, n, i);

        //print_2d(sub_arr, n - 1);

        tmp = arr[0][i] * get_determinant(sub_arr, n - 1);

        det  = tmp;
    }

    return det;
};

int main() {
    int n;
    scanf("%d", amp;n);

    int **arr = (int **) malloc(n * sizeof(int*));

    for(int i = 0; i < n; i  ){
        arr[i] = (int*) malloc(n * sizeof(int));

        for(int j = 0; j < n; j  ){
            scanf("%d", amp;arr[i][j]);
        }
    }

    ll res = get_determinant(arr, n);
    printf("%lld", res);

    return 0;
}
 

Я попытался отладить код и в функции get_subarray после того , как выполнение достигнет индекса i = 1 и j = 0 или k = 2 и m = 1 , я получаю ошибку/ошибку сегментации.

Я попробовал ту же логику, используя векторы в C , и она показывает правильный ответ, но в C я получаю ошибку сегментации.

Комментарии:

1. Какие входные данные следует предоставить программе и каков ожидаемый результат?

2. Это выглядит подозрительно… вы уверены, что хотите назначить » я » на этом шаге?.. sub_arr[i] = (int*) malloc((n — 1) * sizeof(int)); Если ничего другого, это утечка памяти, так как вы теряете выделяемый указатель, не сохраняя его, скажем, в sub_arr[i][j].

Ответ №1:

Вы создаете массив «подмножество» размером n-1, затем перебираете его от j = 0 до n — 1, но всегда назначаете подмножество[i] вместо подмножества[j]. Почему способ создания «подмассива» отличается от «массива»? Создайте одну функцию, которая может возвращать матрицу определенного размера.

 int **sub_arr = (int**)malloc((n - 1) * sizeof(int *));
for(int j = 0; j < n - 1; j  ) {
     sub_arr[i] = (int*) malloc((n - 1) * sizeof(int)); // <--  
}
 

Если функция называется get_subarray, то почему бы не вернуть сам массив непосредственно из нее, чтобы вы могли избежать таких ошибок.