我想做的是使用insertion_sort算法对矩阵的列进行排序,这是进入段错误的排序函数,我尝试进行故障排除,发现将
j>=0
设置为j>0
可以使代码运行良好,但是第一个元素没有排序。
void insertion_sort(int ***A, int n, int m) {
int key, j;
for (int k = 0; k < m; k++)
for (int i = 1; i < n; i++) {
*key = *A[i][k];
for(j = i - 1; *key > *A[j][k] && j >= 0; j--) {
*A[j + 1][k] = *A[j][k];
}
*A[j + 1][k] = *key;
}
}
以防万一我在分配内存时犯了一些错误,我也将分配内存的函数留在这里:
int*** allocMatrix(int n, int m) {
int ***a = calloc(n, sizeof(int**));
int i, j;
for(i = 0; i < n; i++) {
a[i] = calloc(m, sizeof(int*));
for(j = 0; j < m; j++) {
a[i][j] = calloc(1, sizeof(int));
*a[i][j] = i + j;
}
}
return a;
}
我试图解决的练习需要你制作一个指针矩阵,这就是为什么我没有使用
int**
来代替。
你创建矩阵的方式很奇怪。您想要一个伪二维数组。您不需要三星级指针。
int** allocMatrix(size_t rows, size_t cols) {
int **a = malloc(rows * sizeof(*a));
for(size_t row = 0; row < rows; row++) {
a[row] = malloc(cols * sizeof(**a));
for(size_t col = 0; col < cols; col++)
a[row][col] = row + col;
}
return a;
}