在 C 中释放结构内的结构
Freeing a struct within a struct in C
所以,我在 C 中工作,我正在分配一个结构类型的数组,并且在该结构中我还在分配另一个不同结构的数组。
typedef struct {
char name[MAX_NAME + 1];
ITEM *items;
} database;
typedef struct {
char name[NAME_MAX + 1];
}ITEM;
database *array = (database*)malloc(n1 * sizeof(database));
array[i].items = (ITEM*)calloc(n2 * sizeof*(ITEM));
命令 free(array);
是否负责释放整个东西,包括我在其中分配的 ITEM 数组?
不,您需要释放 calloc()
或 malloc()
完成的每个数据分配。
几点
calloc(n2 * sizeof*(ITEM));
是完全错误的。你需要这样写
array[i].items = calloc(n2, sizeof(ITEM));
- 您不需要对从
malloc()
和 calloc()
返回的值进行类型转换
- 始终通过检查指针
NULL
来检查 heap-allocation 是否成功
- struct
ITEM
应该在 struct database
之前声明,以避免 forward-declaration 错误
- 您需要使用循环释放资源,该循环将迭代到
n1
for (size_t i = 0; i < n1; i++)
{
free(array[i].items);
}
free(array);
所以,我在 C 中工作,我正在分配一个结构类型的数组,并且在该结构中我还在分配另一个不同结构的数组。
typedef struct {
char name[MAX_NAME + 1];
ITEM *items;
} database;
typedef struct {
char name[NAME_MAX + 1];
}ITEM;
database *array = (database*)malloc(n1 * sizeof(database));
array[i].items = (ITEM*)calloc(n2 * sizeof*(ITEM));
命令 free(array);
是否负责释放整个东西,包括我在其中分配的 ITEM 数组?
不,您需要释放 calloc()
或 malloc()
完成的每个数据分配。
几点
calloc(n2 * sizeof*(ITEM));
是完全错误的。你需要这样写
array[i].items = calloc(n2, sizeof(ITEM));
- 您不需要对从
malloc()
和calloc()
返回的值进行类型转换
- 始终通过检查指针
NULL
来检查 heap-allocation 是否成功
- struct
ITEM
应该在 structdatabase
之前声明,以避免 forward-declaration 错误 - 您需要使用循环释放资源,该循环将迭代到
n1
for (size_t i = 0; i < n1; i++)
{
free(array[i].items);
}
free(array);