c++ - std::string::operator[] 的结果地址是否指向一个可写的、以 nul 结尾的缓冲区?

标签 c++ stl operators stdstring c++03

我正在修改接受 const char* 并使用函数 ProcessString 的函数。 ProcessString 是一个函数,它需要一个以 null 结尾的字符缓冲区作为 char*。缓冲区中的字符可能会修改,也可能不会修改,如下面的函数签名所定义。为了“弥合差距”,我使用了一个临时的 std::string:

void ProcessString( char* str );

void SomeFunction( const char* str )
{
  string temp(str);
  ProcessString( &temp[0] );
}

我的主要问题是关于 std::string::operator[] 的保证以及上面 &temp[0] 返回的地址是否是一个可用的、以 null 结尾的缓冲区作为 char*。其次,非常第二,有没有更好的方法来做到这一点?

我正在使用 C++03。

最佳答案

这仅在 C++11 中具有明确定义的行为;在以前的标准中,std::string不保证其内部缓冲区的连续存储。

然而,虽然该代码在 C++11 中完全没问题,但更惯用的方法是使用 std:vector<char> ,自 C++03 以来保证连续存储:

void ProcessString(char* str);

void SomeFunction(char const* str)
{
    // + 1 for terminating NUL
    std::vector<char> temp(str, str + std::strlen(str) + 1);
    ProcessString(&temp[0]); // or temp.data() in C++11
}

关于c++ - std::string::operator[] 的结果地址是否指向一个可写的、以 nul 结尾的缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9728450/

相关文章:

c++ - 查找操作的时间复杂度

Java 不大于或等于 Char 类型的运算符

c++ - 在 C++ 中重载 +=

c++ - 你怎么知道如何释放指针数组?

c++ - 段错误代码的可能原因是什么

c++ - 类型特征定义。特征 blob 和元函数

c++ - 如何转换 if 到 switch?

C++ 11 future_status::deferred 不工作

c++ - 重新分配 vector 的内存

c++ - 这个语法 (0 < x < 10) 在 C++ 中有什么作用?