在 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);
提前致谢,
克里斯蒂安
分配了两块内存:
int *mfields = (int *) malloc(sizeof(int) * rows * cols);
int **matrix = (int **) malloc(sizeof(int *) * rows);
因此应该释放两块内存:
free(matrix);
free(mfields);
像这个循环一样释放多个内存块:
for (int i = 0; i < rows; i++) {
free((matrix[i]));
是不正确的,因为它将从未从 malloc
.
返回的地址传递给 free
一般来说,像pointers-to-pointers这样实现矩阵是不好的。这会阻止处理器进行负载预测并降低性能。如果将与代码一起使用的 C 实现支持可变长度数组,那么最好只分配一块内存:
int (*matrix)[cols] = malloc(rows * sizeof *matrix);
如果可变长度数组支持不可用,则程序应分配一块内存并使用手动计算来寻址数组元素。虽然这对程序员来说可能是更多的工作,但它对性能更好:
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);
我拼命想释放一个 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);
提前致谢, 克里斯蒂安
分配了两块内存:
int *mfields = (int *) malloc(sizeof(int) * rows * cols);
int **matrix = (int **) malloc(sizeof(int *) * rows);
因此应该释放两块内存:
free(matrix);
free(mfields);
像这个循环一样释放多个内存块:
for (int i = 0; i < rows; i++) {
free((matrix[i]));
是不正确的,因为它将从未从 malloc
.
free
一般来说,像pointers-to-pointers这样实现矩阵是不好的。这会阻止处理器进行负载预测并降低性能。如果将与代码一起使用的 C 实现支持可变长度数组,那么最好只分配一块内存:
int (*matrix)[cols] = malloc(rows * sizeof *matrix);
如果可变长度数组支持不可用,则程序应分配一块内存并使用手动计算来寻址数组元素。虽然这对程序员来说可能是更多的工作,但它对性能更好:
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);