【发布时间】:2021-08-07 09:04:14
【问题描述】:
如何释放在这个结构中分配的内存
struct image_t {
char type[3];
int **ptr;
int width;
int height;
};
在第一个函数中我做了这些分配:
struct image_t *struktura = (struct image_t *)malloc(sizeof(struct image_t));
int **ptr = (int**)malloc(struktura->height * sizeof(int*));
for (i = 0; i < struktura->height; i++) {
*(ptr + i) = (int *)malloc(struktura->width * sizeof(int));
if (*(ptr + i) == NULL) {
break;
}
}
在第二个函数中,我必须释放分配的内存,所以我尝试释放类似这样的内存,但它不起作用
void destroy_image(struct image_t **m) {
if (m != NULL) {
if (*m != NULL) {
if ((*m)->ptr != NULL) {
for (int i = 0; i < (*m)->height; i++) {
free(*((*m)->ptr + i));
}
free((*m)->ptr);
free(*m);
}
}
}
}
我不能更改销毁函数的声明,所以结构上必须有双指针。
【问题讨论】:
-
为了创建任何东西的
**(模拟二维数组),这是一个两步过程(1)分配一个rows的指针块,(2)循环rows次分配一个包含cols编号的块,您需要将地址依次分配给每个指针。要释放所有内存,只需反转该过程,例如(2) 循环rows释放分配给每个指针的每个块的次数,然后 (1) 进行一次调用以释放指针。 (您可以将height和width替换为rows和cols) -
在C中,
malloc的返回不需要强制转换,没有必要。见:Do I cast the result of malloc? -
建议:如果您的
ptr是一个像素数据数组,我建议将其设为一个连续的数据数组,而不是二维数组。
标签: c struct allocation