You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言新手求教:如何正确释放函数返回的结构体?

如何正确释放包含动态分配成员的结构体(由函数返回引用)

我是C语言新手,正在学习如何释放由函数返回引用的结构体。以下是我的示例代码:

typedef struct test_t{ char *test_c; } test_t;
int testFunc(test_t** output){
    test_t* testStruct = malloc(sizeof(testStruct));
    char* buf = malloc(sizeof(char) * 5);
    strcpy(buf, "test");
    testStruct->test_c = buf;
    *output = testStruct;
    return 0;
}
int main() {
    test_t* test;
    testFunc(&test);
    printf("%s\n",test->test_c);
    // 此处需补充释放逻辑
}

请问该如何正确释放这类结构体?


嗨,我来帮你理清楚这个问题~ 你的结构体里嵌套了动态分配的成员指针,所以释放的时候不能直接只free结构体本身,得按顺序来,不然会造成内存泄漏:

释放步骤拆解

  1. 先清理结构体内部的动态内存:你的test->test_c是用malloc分配的字符串缓冲区,所以首先要释放这块内存——free(test->test_c);。这里可以加个空指针检查,避免后续如果函数返回空结构体时出错。
  2. 再释放结构体本身:等内部的动态内存都清理干净后,再释放结构体的内存free(test);,最后把test置为NULL,防止后续不小心访问野指针。

补充后的完整main函数代码

int main() {
    test_t* test;
    testFunc(&test);
    printf("%s\n",test->test_c);
    
    // 释放逻辑开始
    if (test != NULL) {
        // 先释放内部的字符串缓冲区
        free(test->test_c);
        // 再释放结构体本身
        free(test);
        // 置空避免野指针
        test = NULL;
    }
    // 释放逻辑结束
    return 0;
}

额外提个小bug

你的testFunc里有个隐藏问题:malloc(sizeof(testStruct))这里,testStruct是指针类型,你实际分配的是指针的大小,不是结构体的大小!这会导致内存分配不足,后续访问结构体成员可能触发越界错误。应该改成malloc(sizeof(test_t))或者malloc(sizeof(*testStruct)),后者更推荐,因为就算结构体名字改了也不用跟着改~

内容的提问来源于stack exchange,提问作者user923814624

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:24:48