big*_*iao 2 c++ arrays comparison pointers string-literals
这是代码示例(在vs2015中编译并运行):
#include<cassert>
using namespace std;
int main() {
const char*p = "ohoh";
const char*p1 = "ohoh";
char p3[] = "ohoh";
char p4[] = "ohoh";
assert(p == p1);//OK,success,is this always true?
assert(p3 == p4);//failed
return 0;
}
Run Code Online (Sandbox Code Playgroud)
据我所知,字符串文字存储在readonly地址空间的段中, const char*p = "ohoh";只是生成一个指向该位置的指针.但是,似乎编译器只生成该字符串文字的一个副本,所以这p==p1是真的.
它是一种优化,还是标准保证的东西?
行为未指定,您不能依赖它.从标准来看,[lex.string]/16
是否所有字符串文字都是不同的(即,存储在非重叠对象中)以及是否对字符串文字的连续评估产生相同或不同的对象是未指定的.
对于p3和p4,他们是不同的东西.请注意,p并p1有指针(字符串字面),但p3和p4来自数组初始化字符串文字.
字符串文字可用于初始化字符数组.如果数组初始化为
char str[] = "foo";,str则将包含该字符串的副本"foo".
这意味着p3并且p4是独立的数组.当衰减到指针时它们将是不同的(因为它们指向不同的数组),那么p3 == p4就是false.