首先我创建了一个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;
}
答案 0 :(得分:3)
第二个(内部)循环永远,因为结束标准适用于i,而不适用于j:i < n_cols; j++
。迟早会遇到一个无效的指针。