我得到了这段代码,但我不太确定为什么它的行为是未定义的。我的猜测是它与两个字符串的内存位置以及 if 条件中的位置比较有关。
int main(void) {
char *str1 = "xyz";
char *str2 = "xyz";
if (str1 == str2) {
printf("Same!\n");
} else {
printf("Not Same!\n");
}
return 0;
}
我得到了这段代码,但我不太确定为什么它的行为是未定义的。我的猜测是它与两个字符串的内存位置以及 if 条件中的位置比较有关。
int main(void) {
char *str1 = "xyz";
char *str2 = "xyz";
if (str1 == str2) {
printf("Same!\n");
} else {
printf("Not Same!\n");
}
return 0;
}
关于是否折叠相同的字符串常量以占用相同的内存,它是未指定的(不是未定义的,有一个微妙的区别)。
C++11, 6.4.5 String literals /6
状态:
如果它们的元素具有适当的值,则未指定这些数组是否不同。如果程序尝试修改这样的数组,则行为未定义。
str1
和都是str2
指向包含四个字符的内存块的指针{ 'x', 'y', 'z', '\0'}
,根据定义,它们是不可修改的。
这意味着编译器可以自由地将这两个变量设置为指向同一个内存块,以提高效率,如果它愿意的话。
因此str1
和str2
(我说的是指针,显然指针后面的内容是相同的)可能相同或不同。
“xyz”是一个字符串文字,它被放入“只读”部分,以只读方式映射到进程空间(这就是您无法更改它的原因)。
所以两者str1
都str2
指向同一个地址。printf("Same!\n");
这就是被处决的原因。
这取决于平台。参考字符串文字:它们去哪儿了?
C 不支持字符串比较运算符,因此在使用 == 运算符比较字符串时,它实际上比较的是字符串地址,并且因为未定义“xyz”字符串常量在只读内存中将具有相同的内存地址。它取决于编译器和机器。
也许它是未定义的,因为它取决于编译器如何优化字符串。在不知道使用什么编译器和什么选项的情况下,通常无法定义结果。