答案 0 :(得分:5)
它们意味着您可以存储指针并在以后使用它。如果在两次访问之间调用某些非const方法,则存储指针所设置的缓冲区内容可能会发生变化,您将面临意外行为。
答案 1 :(得分:4)
const char* data() const;
这是说调用const char *
返回的str.data()
不会改变,除非有人修改它来自的字符串。一旦有人调用非常量成员函数,返回的指针可能无效,或者可能指向与str.data()
函数返回后立即指向的数据不同的数据。
这意味着您可以将返回的数据传递给C函数。这意味着你不应该做这样的事情:
const char *old = str.data();
size_t len = str.length();
...call a function that modifies str...
// cout << old << endl;
// Since old is not guaranteed to be null terminated (thanks MSalter),
// do something else with the old data instead of writing to cout.
// Inventiveness not at a high this morning; this isn't a particularly
// good example of what to do - a sort of string copy.
char buffer[256];
memcpy(buffer, old, MIN(sizeof(buffer)-1, len));
buffer[len] = '\0';
当 I / O 内存复制完成时,old
可能不再有效,len
也可能不正确。
答案 2 :(得分:1)
有时,您需要访问格式化为字符数组的字符串 - 通常是因为您需要将字符串传递给某个函数,该函数需要这样的字符串(例如strcmp
)。您可以使用data
或c_str
成员执行此操作,但您必须遵守在您提供的链接中明确说明的调用函数的规则:
返回的数组指向 内部位置不应该 直接在程序中修改。它的 内容保证保留 只有到下次通话才会改变 一个非常数的成员函数 字符串对象。
您无法修改字符数组 - 字符串对象假设您不这样做,如果这样做会导致未定义的行为。