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

C语言返回char*时如何避免内存泄漏?附代码优化需求

问题分析与修复

原代码存在两个致命问题:

  • 变量名错误:函数参数是val,但switch分支里使用了未定义的value,编译直接报错。
  • 严重内存泄漏:先malloc(300)分配堆内存,随后直接将name指向字符串常量(如"dog"),导致malloc的内存地址丢失,永远无法释放;同时返回的字符串常量位于只读数据区,调用者如果尝试free会触发程序崩溃。

修复方案(基于Glib)

利用Glib的g_strdup()函数,它会将字符串常量复制到堆内存中,返回的指针需要调用者用g_free()释放,既解决内存泄漏,又符合函数返回char*的要求:

char *func(int val) {
    switch(val) {
        case 0:
            return g_strdup("dog");
        case 1:
            return g_strdup("cat");
        case 2:
            return g_strdup("elephant");
        default:
            return g_strdup("wrong entry");
    }
}

额外说明

  • 调用该函数后,必须用g_free()释放返回的指针,避免新的内存泄漏:
    char *result = func(0);
    if (result) {
        // 使用result
        g_free(result);
    }
    
  • 如果不需要返回可修改的堆内存,也可以直接返回字符串常量,但要将函数声明改为const char* func(int val),同时明确告知调用者不能对返回值调用free:
    const char *func(int val) {
        switch(val) {
            case 0: return "dog";
            case 1: return "cat";
            case 2: return "elephant";
            default: return "wrong entry";
        }
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:22:11