相同字符串字面量的内存分配是否有标准规定?
字符串字面量的内存分配规则
先看你给出的代码:
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
相关产品推荐
相关产品推荐

