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

从函数返回字符串字面量是否安全?三类技术疑问解析

从函数返回字符串字面量是否真的安全?

先看两段对比代码:

第一段代码编译无警告:

char *test() {
    return "HELLO";
}

int main() {
    char *p = test();
    printf("%s\n", p);
}

第二段代码会触发编译器警告:

char *test() {
    char arr[] = "HELLO";
    return arr;
}

int main() {
    char *p = test();
    printf("%s\n", p);
}

针对你提出的三个问题,逐一解答:

1. 字符串字面量是否确实存储在名为string literal pool的内存区域?

C语言标准里并没有"string literal pool"这个官方术语,但在大多数编译器的实现中,字符串字面量会被存放在只读数据段(比如Linux下ELF文件的.rodata段)。为了节省内存,很多编译器会把内容相同的字符串字面量合并到同一个内存地址,这个合并机制常被称为"字符串池",但这属于实现细节,不是C标准强制要求的行为。

2. 若上述结论成立,该区域存储的数据是否可视为全局数据?

可以视为具有全局生命周期的数据。这类内存区域在程序启动时就完成分配,直到程序退出才会被释放,生命周期和全局变量完全一致。不过要注意:字符串字面量是只读的,尝试修改它会触发未定义行为(比如程序崩溃),这一点和普通可写全局变量不同。

3. 由于字符串字面量类似全局数据,从函数返回它是否始终安全?

是的,始终安全。因为字符串字面量的生命周期覆盖整个程序运行期,函数返回后,指向它的指针依然指向有效的内存区域,后续使用这个指针不会出现问题。

而第二段代码中char arr[] = "HELLO"是把字符串字面量的内容复制到栈上的数组中,栈内存会在函数返回后被回收复用,此时返回的数组指针就变成了"悬空指针",后续访问会导致未定义行为,这也是编译器发出警告的原因。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 15:36:32