我一直认为字符串字面量的存储是由实现定义的,所以编译器可以自由地卷起多个字面量,这样,给定
static const char* foo = "blah";
static const char* bar = "blah";
foo和bar可以指向相同的内存。然而,我不知道在以下情况下是否也是这样:
static const char foo[] = "blah";
static const char bar[] = "blah";
发布于 2011-03-09 22:13:44
在第二种情况下,您声明了两个数组,并且每个数组都有一个不同的地址。因此,地址不会是相同的。
您可以通过打印foo
和bar
的地址来轻松地测试它(在两种情况下都是&foo != &bar
,但在第一种情况下只意味着指针位于不同的位置,而在第二种情况下意味着数组位于不同的位置:(void*)&foo == (void*)&foo[0]
表示数组)
发布于 2011-03-09 23:13:21
@Ben Voight引用了标准:
intro.object说:
两个不同的对象既不是位fi域,也不是大小为零的基类子对象,它们应该具有不同的地址。
但在标准中还有另一条同样重要的规则: as-if规则。
也就是说,该标准保证您观察到的两个不同的对象的地址应该是不同的。
但是,据我所知,如果编译器可以证明你没有观察到一个对象的地址,它就可以将它与一个现有的对象合并(因为你没有观察到它的地址,所以你不会意识到这一点!)
这可能是该措施扰乱实验的典型案例:)?
发布于 2011-03-09 22:23:20
在第二种情况下,这两个变量实际上是数组,因此它们肯定会指向不同的位置。
static const char foo[] = "blah";
static const char bar[] = "blah";
cout << sizeof(foo) << " : " << (void*)foo << endl;
cout << sizeof(bar) << " : " << (void*)bar << endl;
输出:(5为数组大小)
5 : 0x8048a99
5 : 0x8048a94
请看这里的输出:http://www.ideone.com/hoH5v (运行时,地址可能与上面显示的地址不同)
然而,在第一种情况下,两者都是指针,并且都指向相同的位置(对于大多数编译器来说)!
static const char *foo = "blah";
static const char *bar = "blah";
cout << sizeof(foo) << " : " << (void*)foo << endl;
cout << sizeof(bar) << " : " << (void*)bar << endl;
输出:(现在4是指针的大小)
4 : 0x8048a94
4 : 0x8048a94
你注意到两个指针的地址是相同的吗?
请参阅:http://www.ideone.com/keaoC
https://stackoverflow.com/questions/5246969
复制相似问题