C语言中如何通过类型转换正确释放动态分配的结构体内存?
C语言结构体动态内存释放正确实现
错误原因梳理
free()函数仅接受指向动态分配堆内存的指针作为参数,只有通过malloc/calloc/realloc申请的内存才需要调用free释放,普通值类型成员不需要释放。- 你代码中对值类型的
id(int)、percentage(float)调用free,属于类型不匹配,是报错的直接原因。 - 只有
char*类型的name成员,如果它指向的内存是动态申请的,才需要先释放name指向的内存,再释放结构体本身。 - 你调整后的代码遗漏了结构体本身的内存释放步骤,同时
val_ref = NULL的操作无意义:函数参数是值传递,修改局部参数不会影响外部传入的实参指针。
正确代码实现
void student_tDeleter(void* val_ref) { // 空指针校验避免非法访问 if (val_ref == NULL) { return; } // 提前做类型转换,避免重复强转代码冗余 student_t* stu_ptr = (student_t*)val_ref; // 仅释放动态申请的name成员(如果name指向的是常量/栈内存则去掉这一步) if (stu_ptr->name != NULL) { free(stu_ptr->name); stu_ptr->name = NULL; } // 释放结构体本身的堆内存 free(stu_ptr); }
补充说明
如果需要函数执行后外部的结构体指针自动被置为NULL,需要将函数参数改为二级指针void** val_ref,解引用拿到原指针地址后再修改即可。
内容的提问来源于stack exchange,提问作者Alex Hu
相关产品推荐
相关产品推荐

