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
相关产品推荐
相关产品推荐

