如何正确释放分配了动态结构体数组的void**双指针内存?
C语言动态内存释放问题求助
原代码
typedef struct thing { void *fooStruct; } thing; typedef struct foo { int *somethingNumber; char something; } foo; extern void **double_ptr; void *ptr; int main() { ptr = (struct thing*)malloc(sizeof(thing) * 5); double_ptr = &ptr; for (int i = 0; i<5 ; i++) { ((struct thing *)*double_ptr)[i].fooStruct = (struct foo*)malloc(sizeof(foo)); } // <我尝试的内存释放代码> return 0; }
问题描述
我尝试了多种方法释放程序中malloc分配的所有内存(所有动态foo结构体、动态thing结构体、ptr及double_ptr),但始终出错。部分尝试方案如下:
// 尝试1: free(double_ptr); // 尝试2: for (int i = 0; i < 5; i++) { aux_ptr = &((struct thing*)*double_ptr)[i]; free(aux_ptr); } free(double_ptr); // 尝试3: void *aux_ptr; for (int i = 0; i < 5; i++) { aux_ptr = ((struct thing*)*double_ptr)[i].fooStruct; free(aux_ptr); aux_ptr = &((struct thing*)*double_ptr)[i]; free(aux_ptr); } free(*double_ptr); // 尝试4: void *aux_ptr; for (int i = 0; i < 5; i++) { aux_ptr = ((struct thing*)*double_ptr)[i].fooStruct; free(aux_ptr); aux_ptr = &((struct thing*)*double_ptr)[i]; free(aux_ptr); } free(double_ptr);
这些尝试均失败:尝试1、4编译报错(无效指针),尝试2、3存在内存泄漏。指针是我的薄弱点,恳请得到帮助。
错误分析
- 尝试1、4:
free(double_ptr)错误double_ptr是指向全局变量ptr的指针,它本身不是通过malloc分配的内存,直接free会触发无效指针错误。 - 尝试2、3:
free(&((struct thing*)*double_ptr)[i])错误ptr指向的是一块连续的、容纳5个thing结构体的内存块(通过malloc(sizeof(thing)*5)分配),数组单个元素的地址不是malloc返回的指针,不能单独free,只能整体释放整个数组块。 - 尝试3中
free(*double_ptr)是正确操作,但前面多释放了元素地址,属于非法释放
正确的内存释放代码
// 先释放每个foo结构体 void *aux_ptr; for (int i = 0; i < 5; i++) { aux_ptr = ((struct thing*)*double_ptr)[i].fooStruct; free(aux_ptr); // 释放每个malloc分配的foo } // 释放整个thing数组(ptr指向的动态内存) free(*double_ptr); // 注意:ptr是全局变量,不是malloc分配的;double_ptr只是指向ptr的指针,二者都无需free
关键说明
- 内存释放顺序要和分配顺序相反:先释放每个
foo(foo依赖thing的内存存在),再释放整个thing数组。 - 只有
malloc(或calloc/realloc)返回的指针才能用free释放,全局变量、栈变量的指针都不能free。
内容的提问来源于stack exchange,提问作者Yuki
相关产品推荐
相关产品推荐

