尝试访问矩阵指针的位置 0 时,代码会进入 SegFault

问题描述 投票:0回答:1

我想做的是使用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**
来代替。

c sorting pointers
1个回答
0
投票

你创建矩阵的方式很奇怪。您想要一个伪二维数组。您不需要三星级指针。

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.