【发布时间】:2023-03-18 02:51:01
【问题描述】:
在 C 语言中,编译器/链接器是否有义务将多次使用的相同字符串文字放入单个内存位置?
const char* a = "abcdef";
const char* b = "abcdef";
//Compare pointers
if (a == b) {
printf("True\r\n");
} else {
printf("False\r\n");
}
在这种情况下,上面的陈述总是正确的(在 MSVC 2017 中是)还是一般未定义的行为?
我们在2 不同的内存位置有字符串文字abcdef 会发生吗?当然,我不计算像12abcdefgh˛这样的字符串,其中abcdef 是字符串的一部分,而是独立的。
【问题讨论】:
-
这取决于编译器选项。是否合并重复定义。
-
我认为 undefined behavior 在这里用词不当。该程序的行为被很好地定义为它将打印“True”或“False”(与段错误相反,格式化您的硬盘驱动器等)
-
实现的行为,显然不要在你的程序中假设。
-
比较不指向(或完全过去)同一数组的指针是未定义的行为。
-
不,编译器不需要将字符串文字的多个实例映射到同一位置。见N1570,6.4.5/7。