Search code examples
cfree

freeing a triple pointer in C


First I created an int** and successfully (I think) freed it like this:

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

Then I created an int*** and tried to free it using the same logic:

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);

but I get the error:

pointer being freed was not allocated

Where did I go wrong? I tried to keep this post short, but if it's important to include how I created the int*** I can add that.

edit, full code:

// 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;
}

Solution

  • The second (inner) loop runs forever, because the end criteria is for i, not for j:i < n_cols; j++. Sooner or later it will hit a non-valid pointer.