假设我有以下代码:
const char str1[] = "asdasd";
const char str2[] = "asdasd";
const char* str3 = "dsadsa";
const char* str4 = "dsadsa";
if (str1 == str2)
{
cout << "str1 == str2" << endl;
}
if (str3 == str4)
{
cout << "str3 == str4" << endl;
}
结果是“ str3 == str4”。为什么?
答案 0 :(得分:10)
对于C ++
str3
和str4
指向相同的string literals,
允许(但不是必需)编译器组合存储以相等或重叠的字符串文字。这意味着,当通过指针进行比较时,相同的字符串文字可能会比较相等,也可能不会相等。
这意味着str3 == str4
是true
还是false
是未指定,这取决于实现,而您使用的是{{1 }}。
另一方面,true
和str1
是独立的数组。
字符串文字可用于初始化字符数组。如果像
str2
这样初始化数组,则char str[] = "foo";
将包含字符串str
的副本。
因此,保证"foo"
为str1 == str2
。
答案 1 :(得分:5)
字符串文字池。编译器倾向于合并相同的字符串文字,因此程序中只有一个副本。这是允许的,但不是必需的;依靠这种情况是不明智的。