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

相同字符串字面量的内存分配是否有标准规定?

字符串字面量的内存分配规则

先看你给出的代码:

int main(void)
{
    printf("%s", "the string");
    printf("%s", "the string");
}

关于相同字符串字面量的内存分配,C语言标准并没有强制要求必须只分配一次内存,这属于编译器的可选优化行为:

  • 标准层面:C标准仅规定字符串字面量拥有静态存储期(内存会在程序整个运行周期内存在),并且其内容是只读的(修改字符串字面量属于未定义行为)。但对于内容完全相同的多个字符串字面量,标准允许编译器自行决定是合并为单一内存实例,还是分别分配独立内存。
  • 编译器优化:主流编译器(比如GCC、Clang)默认会开启字符串合并优化(例如GCC的-fmerge-constants选项,默认启用),这就是你在ELF文件中只看到一次"the string"的原因。如果手动关闭该优化(比如GCC添加-fno-merge-constants编译参数),编译器就会为每个字符串字面量单独分配内存,此时ELF文件里会出现两个相同的字符串。
  • 注意事项:不要在代码中依赖字符串字面量的合并行为,比如通过指针地址比较来判断两个字符串是否相同。因为不同编译器、不同编译选项下,这个行为可能不一致,依赖它会导致代码失去可移植性。

内容的提问来源于stack exchange,提问作者Łukasz Przeniosło

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:12:40