首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >字符串文字唯一性要求

字符串文字唯一性要求
EN

Stack Overflow用户
提问于 2011-03-09 22:10:58
回答 3查看 161关注 0票数 2

我一直认为字符串字面量的存储是由实现定义的,所以编译器可以自由地卷起多个字面量,这样,给定

代码语言:javascript
运行
复制
static const char* foo = "blah";
static const char* bar = "blah";

foo和bar可以指向相同的内存。然而,我不知道在以下情况下是否也是这样:

代码语言:javascript
运行
复制
static const char foo[] = "blah";
static const char bar[] = "blah";
EN

回答 3

Stack Overflow用户

发布于 2011-03-09 22:13:44

在第二种情况下,您声明了两个数组,并且每个数组都有一个不同的地址。因此,地址不会是相同的。

您可以通过打印foobar的地址来轻松地测试它(在两种情况下都是&foo != &bar,但在第一种情况下只意味着指针位于不同的位置,而在第二种情况下意味着数组位于不同的位置:(void*)&foo == (void*)&foo[0]表示数组)

票数 1
EN

Stack Overflow用户

发布于 2011-03-09 23:13:21

@Ben Voight引用了标准:

intro.object说:

两个不同的对象既不是位fi域,也不是大小为零的基类子对象,它们应该具有不同的地址。

但在标准中还有另一条同样重要的规则: as-if规则。

也就是说,该标准保证您观察到的两个不同的对象的地址应该是不同的。

但是,据我所知,如果编译器可以证明你没有观察到一个对象的地址,它就可以将它与一个现有的对象合并(因为你没有观察到它的地址,所以你不会意识到这一点!)

这可能是该措施扰乱实验的典型案例:)?

票数 1
EN

Stack Overflow用户

发布于 2011-03-09 22:23:20

在第二种情况下,这两个变量实际上是数组,因此它们肯定会指向不同的位置。

代码语言:javascript
运行
复制
static const char foo[] = "blah";
static const char bar[] = "blah";
cout << sizeof(foo) << " : " << (void*)foo << endl;
cout << sizeof(bar) << " : " << (void*)bar << endl;

输出:(5为数组大小)

代码语言:javascript
运行
复制
5 : 0x8048a99
5 : 0x8048a94

请看这里的输出:http://www.ideone.com/hoH5v (运行时,地址可能与上面显示的地址不同)

然而,在第一种情况下,两者都是指针,并且都指向相同的位置(对于大多数编译器来说)!

代码语言:javascript
运行
复制
static const char *foo = "blah";
static const char *bar = "blah";
cout << sizeof(foo) << " : " << (void*)foo << endl;
cout << sizeof(bar) << " : " << (void*)bar << endl;

输出:(现在4是指针的大小)

代码语言:javascript
运行
复制
4 : 0x8048a94
4 : 0x8048a94

你注意到两个指针的地址是相同的吗?

请参阅:http://www.ideone.com/keaoC

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5246969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档