所以我做了以下测试:
char* a = "test";
char* b = "test";
char* c = "test\0";
Run Code Online (Sandbox Code Playgroud)
现在的问题是:
1)有保证a==b吗?我知道我在比较地址.这并不是要比较字符串,而是将相同的字符串文字存储在单个内存位置
2)为什么不a==c呢?编译器是否应该能够看到它们引用相同的字符串?
3)是否\0附加了额外的内容c,即使它已经包含一个?
我不想为此提出3个不同的问题,因为它们似乎有点相关,对不起'.
注意:标签是正确的,我对C++感兴趣.(虽然请指明C的行为是否不同)
R. *_*des 18
是否保证a == b?
不可以.但是,§2.14.5/ 12允许:
是否所有字符串文字都是不同的(即存储在非重叠对象中)是实现定义的.尝试修改字符串文字的效果是未定义的.
正如你可以从最后一句话中看到的那样使用char*而不是char const*一个麻烦的配方(你的编译器应该拒绝它;确保你启用了警告并选择了高一致性级别).
为什么不= = c?编译器是否应该能够看到它们引用相同的字符串?
不,他们不需要引用相同的字符数组.一个有五个元素,另外六个.实现可以将两者存储在重叠存储中,但这不是必需的.
是否在c的末尾附加了一个\ 0,即使它已经包含一个?
是.
1 - 绝对没有.如果编译器选择共享相同的静态字符串,则可能== b.
2 - 因为它们不是指同一个字符串
3 - 是的.
这里的行为在C和C++之间没有什么不同,除了C++编译器应该拒绝赋值给非const char*.