我以这种方式分配非方矩阵,但我不确定我是否正确使用了解除分配
float **matrix_alloc(int m /* rows */, int n /* columns */)
{
int i;
float **arr = malloc(m*sizeof(*arr));
for(i=0; i<m; i++)
{
arr[i]=malloc(n*sizeof(**arr));
}
return arr;
}
我尝试过两种释放内存的方法
-Attempt A 循环行
void free_mem_mat(int m, float **array) {
int i;
for (i = 0; i < m; i++) {
free(array[i]);
}
free(array);
}
- 尝试B 循环列
void free_mem_mat(int n, float **array) {
int i;
for (i = 0; i < n; i++) {
free(array[i]);
}
free(array);
}
我应该用什么来免费?行 A 的方式 B ? (我知道写的方法是一样的,我已经重写了这个最明显的可能)
答案 0 :(得分:3)
每个free()
* 需要一个malloc()
。 m+1
有malloc()
次来电;您最好m+1
拨打free()
。
鉴于作为起点,选项A是正确的解决方案。但是,值得注意的是,只要将给定分配函数的m
维度作为释放函数的大小参数传递,两个函数(选项A和选项B)就完全等效。备选方案B中的评论具有误导性;你没有在列上循环。
假设:
enum { MAT_ROWS = 20, MAT_COLS = 30 };
float **matrix = matrix_alloc(MAT_ROWS, MAT_COLS);
对free_mem_mat()
的正确调用是:
free_mem_mat(MAT_ROWS, matrix);
*如果您使用realloc()
或calloc()
,这是一个过于简化的陈述。对于不是free()
&d; d的每个malloc()
,您需要realloc()
,而对于没有free()
的每个realloc()
,您需要free()
calloc()
1}} - 将大小设置为0.就malloc()
而言,free()
等同于{{1}}。
答案 1 :(得分:1)
问题在于它有很多分配
我更喜欢这种模式
#include <stdio.h>
#include <stdlib.h>
float **matrix_alloc(int m /* rows */, int n /* columns */)
{
int i;
float **arr = malloc(m * sizeof(float *));
*(arr) = malloc(m * n * sizeof(float));
for (i = 0; i < m; i++) {
*(arr + i) = (*(arr) + i * n);
}
return arr;
}
void free_mem_mat(float **array) {
free(*(array));
free(array);
}
int main () {
float **matrix = matrix_alloc(10, 20);
free_mem_mat(matrix);
return 0;
}
答案 2 :(得分:0)
arr被分配为m个元素的数组,每个元素都指向一些已分配的内存。因此,您必须释放arr中的m个指针。在释放每个东西时,你不需要提到指向的东西的大小。