包含'\ 0'的字符串文字 - 为什么它们不相同?

AMC*_*der 5 c++ string

所以我做了以下测试:

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,即使它已经包含一个?

是.


Edw*_*nge 6

1 - 绝对没有.如果编译器选择共享相同的静态字符串,则可能== b.

2 - 因为它们不是指同一个字符串

3 - 是的.

这里的行为在C和C++之间没有什么不同,除了C++编译器应该拒绝赋值给非const char*.