释放C中的三重指针

freeing a triple pointer in C

首先我创建了一个 int** 并成功地(我认为)释放了它:

for (int i = 0; i < r; i++) 
    free(A[i]);
free(A);

然后我创建了一个 int*** 并尝试使用相同的逻辑释放它:

for (int i = 0; i < n_rows; i++) {
    for (int j = 0; i < n_cols; j++) {
        free(matrix[i][j]);
    }
    free(matrix[i]);
}
free(matrix);

但我收到错误消息:

pointer being freed was not allocated

我哪里错了?我试图让这个 post 简短,但如果包括我如何创建 int*** 很重要,我可以添加它。

编辑,完整代码:

// Uninitialized 3D matrix
int*** malloc3Dmatrix(int n_rows, int n_cols, int depth) {
    int ***matrix;
    matrix = malloc(n_rows*sizeof(int**));
    for (int row = 0; row < n_rows; row++) {
        matrix[row] = malloc(n_cols*sizeof(int*));
        for (int col = 0; col < n_cols; col++) {
            matrix[row][col] = malloc(depth*sizeof(int));
        }
    }
    return matrix;
}

// fill 3D matrix
void fill3DMatrix(int ***matrix, int n_rows, int n_cols, int depth) {

    printf("Insert the elements of your matrix:\n");
    for (int i = 0; i < n_rows; i++) {
        for (int j = 0; j < n_cols; j++) {
            for (int k = 0; k < depth; k++) {
                printf("Insert element [%d][%d][%d]: ", i, j, k);
                scanf("%d", &matrix[i][j][k]);
                printf("matrix[%d][%d][%d]: %d\n", i, j, k, matrix[i][j][k]);
            }
        }
    }   
    return;
}

int main(){

    // create uninitialized 3D matrix
    int n_rows = 3, n_cols = 3, depth = 3;
    int ***matrix = malloc3Dmatrix(n_rows, n_cols, depth);

    // fill and print 3D matrix
    fill3DMatrix(matrix, n_rows, n_cols, depth);
    print3DMatrix(matrix, n_rows, n_cols, depth);


    // free 3D matrix   
    for (int i = 0; i < n_rows; i++) {
        for (int j = 0; i < n_cols; j++){
            free(matrix[i][j]);
        }
        free(matrix[i]);
    }
    free(matrix);


    return 0;
}

第二个(内部)循环运行永远,因为结束条件是针对 i,而不是 j:i < n_cols; j++。它迟早会碰到一个无效的指针。