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