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

动态分配字符串内存:两段C代码是否安全等效?是否需释放内存?

两段C代码的安全性与等效性解析

咱们一个一个来拆解你的问题,先提个小细节:你代码里函数名和全局变量名都用了test,这在C里属于标识符冲突,编译会报错,我下面把变量名改成test_var方便说明~

问题1:第一段代码的使用是否安全?

先看代码:

char* test() { 
    char* returnValue = "test"; 
    return returnValue; 
} 
char* test_var = test(); 
printf("%s", test_var);

这段代码是安全的,原因在于:

  • "test"是字符串字面量,它会被编译器放在程序的只读数据段(通常叫.rodata),这块内存的生命周期和整个程序的运行周期一致——从程序启动到退出都存在。
  • 函数返回的指针指向的就是这块永久存在的内存,所以后续用printf打印完全没问题。

不过有个注意点:你不能通过这个指针修改字符串内容(比如写test_var[0] = 'T'),因为字符串字面量是只读的,这么做会触发未定义行为(大概率会导致程序崩溃)。

问题2:两段代码是否等效?是否需要调用free()?

先看第二段代码:

char* test() { 
    char* returnValue = strdup("test"); 
    return returnValue; 
} 
char* test_var = test(); 
printf("%s", test_var);

这两段代码完全不等效,核心区别在内存管理和使用场景上:

  1. 内存来源不同:
    • 第一段返回的是只读数据段里字符串字面量的指针,内存由操作系统/编译器自动管理,不需要你手动干预;
    • 第二段里strdup函数会在堆(heap)上分配一块新内存,把"test"的内容复制进去,返回的是这块堆内存的指针。
  2. 可修改性不同:
    • 第一段的指针指向只读内存,不能修改内容;
    • 第二段的指针指向堆内存,你可以合法修改字符串内容(比如test_var[0] = 'T'是允许的)。
  3. 内存释放要求不同:
    • 第一段不需要调用free(),因为内存不是你手动分配的;
    • 第二段必须调用free(test_var),否则这块堆内存会一直占用直到程序退出,造成内存泄漏——如果是在循环或者长期运行的程序里,这种泄漏会累积导致内存耗尽。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:22:52