C ++字符串的内部缓冲区地址未定义的行为

时间:2015-05-06 14:26:58

标签: c++11

在c ++ 11标准下是否存在以下未定义的行为:

(试图获取字符串内部缓冲区的地址)

std::string s;
... = &s[0];

例如s为空?

我知道我们有c_str(), data(),但不过。

注意

这是来自与某人的辩论,这不是为了促进hacky编码

2 个答案:

答案 0 :(得分:7)

在C ++ 11中,代码定义明确,但可能无法达到预期效果。确切的影响是,根据21.4.5 / 2:

  

返回: *(begin() + pos) if pos < size(),否则引用T类型的对象   charT();参考值不得修改。

因此,如果字符串非空,则返回对内部缓冲区start的引用。如果它为空,则返回对char的引用,其值为0,其位置为内存是实现细节。

答案 1 :(得分:0)

我认为这会在你的堆栈的某个地方给你一个地址。由于大多数实现中的小字符串优化。

http://www.cplusplus.com/reference/string/string/operator[]/说:

  

如果pos等于字符串长度,则该函数返回对字符串中最后一个字符后面的空字符的引用,该字符不应被修改。

只要index-parameter大于string的大小,就可能会以未定义的行为形式出现问题。