我将如何释放这些 mallocs?
How would I free these mallocs?
我有这个函数可以为矩阵分配内存:
double **mmalloc(int r, int c){
double **matrix = (double **)malloc((r)*sizeof(double*));
for (int y = 0; y < r; y++){
matrix[y] = (double *)malloc(c*sizeof(double));
}
for (int y = 0; y < r; y++){
for(int x = 0; x < c; x++){
matrix[y][x] = 0;
}
}
return matrix;
}
如何释放返回矩阵的所有内存?我有这个函数来释放矩阵...我可以释放矩阵的行但我不能释放列。
释放函数如下:
// Free all memory allocated for A
void mfree(int r, int c, double **A){
for (int y = 0; y < r; y++){
free(A[y]);
}
}
void xfree(int r, int c, double **A){
for (int y = 0; y < r; y++){
free(A[y]);
}
free(A)
}
您需要一一释放所有行,然后是最初分配的列(包含所有行)
void xfree(int r, int c, double **A){
for (int y = 0; y < r; y++){
free(A[y]);
}
free (A);
}
按照这个顺序。
double ** (Initial allocation)
↓
(double *)row0 → col0 col1 ...
(double *)row1 → col0 col1 ...
...
其中每个 row
i 由(双)列组成。
为了完全释放一个动态分配的数组数组,记住这些规则
free的数量必须等于用于分配数组的malloc的数量及其数组
考虑如果某些东西是 免费的d 它就不再可用了,即使它可能偶然工作(这种行为之后的行为被称为未定义行为)。例如,如果你先 free(A)
,你不应该 free(A[i])
因为 A
- 一个包含指针列表的内存 space - 不应该是 allocated/usable 了。
因此 free 首先是最里面的元素("contained",例如 A[i]
)然后 free "containers"(例如A
)。
我会 'cheat' 并且只为您的数据分配一个连续的块,然后是第二个块让您可以数组访问您的行:
int main(){
int r=3;
int c=4;
double* data = malloc(sizeof(double) * r * c);
double** matrix = malloc(sizeof(double*) * r);
int i;
for (i=0;i<r;++i) { /* build the nice syntax accessor */
matrix[i] = &data[i*c];
}
for (i=0;i<(r*c);++i) { /* you can fill/clear the whole matrix in one loop too */
data[i] = i;
}
// access data through matrix as a normal 2d array
matrix[2][2] = 1.1;
int x,y;
for (x=0;x<r;++x) {
for (y=0;y<c;++y) {
printf("[%1.1f]", matrix[x][y]);
}
printf("\n");
}
// when done
free(matrix);
free(data);
return 0;
}
输出:
[0.0][1.0][2.0][3.0]
[4.0][5.0][6.0][7.0]
[8.0][9.0][1.1][11.0]
我认为这两个 free 的调用顺序甚至都不重要(前提是您同时执行这两个操作并且两者之间没有访问权限),因为一个数组只是指向另一个数组 - 您维护对每个数组的单独引用。
您甚至可以将数据和矩阵一起存储在一个结构或其他东西中,然后有一个函数接受该结构并释放两个区域(或两个区域然后释放结构本身)。
注意:这似乎可以编译和工作,但我不是以编写 C 为生,在生产代码中使用之前征求第二意见,以防我遗漏了什么
我有这个函数可以为矩阵分配内存:
double **mmalloc(int r, int c){
double **matrix = (double **)malloc((r)*sizeof(double*));
for (int y = 0; y < r; y++){
matrix[y] = (double *)malloc(c*sizeof(double));
}
for (int y = 0; y < r; y++){
for(int x = 0; x < c; x++){
matrix[y][x] = 0;
}
}
return matrix;
}
如何释放返回矩阵的所有内存?我有这个函数来释放矩阵...我可以释放矩阵的行但我不能释放列。
释放函数如下:
// Free all memory allocated for A
void mfree(int r, int c, double **A){
for (int y = 0; y < r; y++){
free(A[y]);
}
}
void xfree(int r, int c, double **A){
for (int y = 0; y < r; y++){
free(A[y]);
}
free(A)
}
您需要一一释放所有行,然后是最初分配的列(包含所有行)
void xfree(int r, int c, double **A){
for (int y = 0; y < r; y++){
free(A[y]);
}
free (A);
}
按照这个顺序。
double ** (Initial allocation)
↓
(double *)row0 → col0 col1 ...
(double *)row1 → col0 col1 ...
...
其中每个 row
i 由(双)列组成。
为了完全释放一个动态分配的数组数组,记住这些规则
free的数量必须等于用于分配数组的malloc的数量及其数组
考虑如果某些东西是 免费的d 它就不再可用了,即使它可能偶然工作(这种行为之后的行为被称为未定义行为)。例如,如果你先
free(A)
,你不应该free(A[i])
因为A
- 一个包含指针列表的内存 space - 不应该是 allocated/usable 了。因此 free 首先是最里面的元素("contained",例如
A[i]
)然后 free "containers"(例如A
)。
我会 'cheat' 并且只为您的数据分配一个连续的块,然后是第二个块让您可以数组访问您的行:
int main(){
int r=3;
int c=4;
double* data = malloc(sizeof(double) * r * c);
double** matrix = malloc(sizeof(double*) * r);
int i;
for (i=0;i<r;++i) { /* build the nice syntax accessor */
matrix[i] = &data[i*c];
}
for (i=0;i<(r*c);++i) { /* you can fill/clear the whole matrix in one loop too */
data[i] = i;
}
// access data through matrix as a normal 2d array
matrix[2][2] = 1.1;
int x,y;
for (x=0;x<r;++x) {
for (y=0;y<c;++y) {
printf("[%1.1f]", matrix[x][y]);
}
printf("\n");
}
// when done
free(matrix);
free(data);
return 0;
}
输出:
[0.0][1.0][2.0][3.0]
[4.0][5.0][6.0][7.0]
[8.0][9.0][1.1][11.0]
我认为这两个 free 的调用顺序甚至都不重要(前提是您同时执行这两个操作并且两者之间没有访问权限),因为一个数组只是指向另一个数组 - 您维护对每个数组的单独引用。
您甚至可以将数据和矩阵一起存储在一个结构或其他东西中,然后有一个函数接受该结构并释放两个区域(或两个区域然后释放结构本身)。
注意:这似乎可以编译和工作,但我不是以编写 C 为生,在生产代码中使用之前征求第二意见,以防我遗漏了什么