c - 释放C中的三重指针

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

但是我得到了错误:

pointer being freed was not allocated

我哪里错了?我试图让这篇文章简短,但如果包括我如何创建 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++ .迟早它会遇到一个无效的指针。

关于c - 释放C中的三重指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38135327/

相关文章:

c - 如何在 g_main_loop_new 中添加 Xorg 事件处理

c - 在KVM中拦截RDTSC指令

c - 释放完全不同的内存后出现段错误

c - 如何释放包含 char 指针的 BST?

c - C中的自由动态二维矩阵

c++ - "Heap Corruption Detected"将指针传递给函数然后在指针上调用 free()

c - 我是否使用循环来迭代小尺寸数组(例如 2 或 3)?

c++ - 两个一般六面体之间的碰撞检测

c - 意外的信号量行为,线程执行超出 sem_wait()

C - free() 对内存做了什么?