当我在C中使用双指针来查找数组的行列式时,出现了分段错误



我试图用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 && j < n - 1 && 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", &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", &arr[i][j]);
}
}
ll res = get_determinant(arr, n);
printf("%lld", res);
return 0;
}

我尝试调试代码,在函数get_subarray中,当执行达到索引i = 1j = 0k = 2m = 1后,我得到分段错误。

我在C++中使用向量尝试了同样的逻辑,它显示了正确的答案,但在C中我得到了分割错误。

创建一个数组"子阵列";在大小为n-1的情况下,从j=0迭代到n-1,但总是分配给subarray[i],而不是subarry[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,那么为什么不直接从中返回数组本身,这样就可以避免此类错误。

最新更新