尽管 c_str() 返回 std::string 的空终止版本,但将 C++ std::string 与 C char* 字符串混合时可能会出现意外。
空字符可能会出现在 C++ std::string 中,这可能会导致细微的错误,因为 C 函数会看到更短的字符串。
错误代码可能会覆盖空终止符。这会导致未定义的行为。然后,C 函数将读取字符串缓冲区之外的内容,从而可能导致崩溃。
#include <string>
#include <iostream>
#include <cstdio>
#include <cstring>
int main()
{
std::string embedded_null = "hello\n";
embedded_null += '\0';
embedded_null += "world\n";
// C string functions finish early at embedded \0
std::cout << "C++ size: " << embedded_null.size()
<< " value: " << embedded_null;
printf("C strlen: %d value: %s\n",
strlen(embedded_null.c_str()),
embedded_null.c_str());
std::string missing_terminator(3, 'n');
missing_terminator[3] = 'a'; // BUG: Undefined behaviour
// C string functions read beyond buffer and may crash
std::cout << "C++ size: " << missing_terminator.size()
<< " value: " << missing_terminator << '\n';
printf("C strlen: %d value: %s\n",
strlen(missing_terminator.c_str()),
missing_terminator.c_str());
}
输出:
$ c++ example.cpp
$ ./a.out
C++ size: 13 value: hello
world
C strlen: 6 value: hello
C++ size: 3 value: nnn
C strlen: 6 value: nnna�