释放C中的三重指针

时间:2016-07-01 00:36:27

标签: c free

首先我创建了一个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);

但是我收到了错误:

  

释放的指针未分配

我哪里出错了?我试图保持这篇文章的简短,但如果包含我创建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;
}

1 个答案:

答案 0 :(得分:3)

第二个(内部)循环永远,因为结束标准适用于i,而不适用于j:i < n_cols; j++。迟早会遇到一个无效的指针。