繁体   English   中英

在 C 中释放动态分配的二维数组时出现问题

[英]Problems when freeing a dynamically allocated 2d array in C

我拼命试图释放一个 2d int 数组,但无法做到。 我猜我初始化数组时出了什么问题? 你能帮帮我吗?

    int rows = 2;
    int cols = 3;
    int *mfields = (int *) malloc(sizeof(int) * rows * cols);
    int **matrix = (int **) malloc(sizeof(int *) * rows);
    for (int i = 0; i < rows; i++) {
        matrix[i] = mfields + i * cols;
        for(int j=0; j<rows;j++) {
            matrix[i][j] = (i+1)*(j+1);
        }
    }
    for (int i = 0; i < rows; i++) {
        free((matrix[i]));
    }
    free(matrix);

提前致谢,克里斯蒂安

分配了 memory 的两个块:

int *mfields = (int *) malloc(sizeof(int) * rows * cols);
int **matrix = (int **) malloc(sizeof(int *) * rows);

因此应该释放 memory 的两个块:

free(matrix);
free(mfields);

像这个循环一样释放 memory 的多个块:

    for (int i = 0; i < rows; i++) {
        free((matrix[i]));

是不正确的,因为它将从未从malloc返回的地址传递给free

通常,将矩阵实现为指向指针的指针是不好的。 这会阻止处理器进行负载预测并降低性能。 如果将与代码一起使用的 C 实现支持可变长度 arrays,那么最好只分配一个 memory 块:

int (*matrix)[cols] = malloc(rows * sizeof *matrix);

如果可变长度数组支持不可用,则程序应分配一块 memory 并使用手动计算来寻址数组元素。 虽然这对程序员来说可能需要更多的工作,但它对性能更好:

int *matrix = malloc(rows * cols * sizeof *matrix);
for (int i = 0; i < rows; i++)
    for (int j = 0; j < cols; j++)
        matrix[i*cols + j] = (i+1) * (j+1);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM