#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, то почему бы не вернуть сам массив непосредственно из нее, чтобы вы могли избежать таких ошибок.