我在C ++中看到了以下代码。它是否定义了行为?

时间:2016-08-05 14:52:22

标签: c++

此代码是否根据C ++标准定义良好?这看起来有点哈哈。

#include <string>
char* GetPointer(std::string& s)
{
    return &s[0];
}

标准是否确保该代码返回指向存储字符的数组中第一个元素的指针?

4 个答案:

答案 0 :(得分:8)

  

basic_string的元素是连续存储的,即对于basic_string s,&amp; *(s.begin()+ n)==&amp; * s.begin()+ n对于[0]中的任何n ,s.size()),或等效地,指向s [0]的指针可以传递给期望指向CharT []数组的第一个元素的指针的函数。

来源:http://en.cppreference.com/w/cpp/string/basic_string

答案 1 :(得分:1)

这是从char获取std::string指针的规范方法,所以它没有任何问题。调用者需要注意,如果字符串发生变化,指针将变为无效。

将“看起来很黑”的东西放入函数中会很方便,所以你不必担心它。

答案 2 :(得分:1)

  

此代码是否根据C ++标准定义良好?

     

标准是否确保该代码返回指向存储字符的数组中第一个元素的指针?

是的,是的。

但是,您必须意识到指向的字符数组不能保证为空终止。因此,您可能无法将指针传递给需要空终止字符串的函数 - 除非您自己设置终止符。

  

看起来有点hacky。

看起来似乎如此,但目前这是如何获得内部数组的非const指针。 C ++ 17将添加char* std::string::data()以使其更清晰。

答案 3 :(得分:1)

是的,将指针返回到一个位置传递给函数的内存中是完全没问题的 如果std::string按值传递,那将是一个不同的故事。

请记住,返回值的有效性与传递的对象的内部缓冲区有关。