能否从作为结构体字段的回调函数中释放该结构体?
问题解答
你的判断是对的,这段代码里freeFunction完全可以释放指针t指向的Test结构体,操作合法且可行。
原因说明:
free()函数的核心作用就是释放通过malloc/calloc/realloc分配的内存块,只要传入的指针是指向这类有效内存的合法指针,不管在哪个函数里调用free()都能完成正确释放。- 你的代码中,
main函数通过malloc(sizeof(*t))分配了Test结构体的内存,把指针t传给freeFunction后,函数的参数t是原指针的副本,但两者指向同一块malloc分配的内存,因此free(t)能精准释放这块内存。
需要注意的细节:
- 内存释放后,
main函数里的原指针t会变成野指针,此时不能再访问它的成员(比如t->freePtr)或者解引用,否则会触发未定义行为——这是使用free()后的常规注意事项,不影响本次释放操作的正确性。
附上你的代码:
typedef struct Test_s Test; typedef void (*FreePtr)(Test*); struct Test_s{ FreePtr freePtr; }; void freeFunction(Test* t) { free(t); } void main(void) { Test* t = malloc(sizeof(*t)); t->freePtr = freeFunction; t->freePtr(t); }
内容的提问来源于stack exchange,提问作者Korsarq
相关产品推荐
相关产品推荐

