使用 std::string::c_str() 修改基础 std::string 是否安全?
Is it safe to use std::string::c_str() to modify the underlying std::string?
我遇到了一些代码,其中包含以下示例的多个实例:
std::string str = "This is my string";
char* ptr = const_cast<char*>(str.c_str());
ptr[5] = 'w';
ptr[6] = 'a';
在这个简化的示例中,使用 const_cast
.[=25 将 std::string::c_str()
returns const char*
赋值给 char*
指针=]
这似乎按预期工作,str
已相应修改。
但是我当地图书馆对std::string::c_str()
的描述是这样的:
Return const pointer to null-terminated contents. This is a handle to internal data. Do not modify or dire things may happen.
并且在 cppreference 中的描述包括:
Returns a pointer to a null-terminated character array with data equivalent to those stored in the string.
...
Writing to the character array accessed through c_str()
is undefined behavior.
在标准 [string.accessors] 中,描述是相似的,没有关于此的信息 ...空终止字符数组,其数据等同于存储在字符串中的数据... 已提供。
这没有澄清问题,反而让我更加困惑,什么字符数组?怎样才算等价?是副本吗?如果是这样,为什么要修改它,还要修改原始字符串?这个实现有定义吗?
我想避免更改使用它的所有代码实例的任务,所以我的问题是:
有什么方法可以纠正吗,使用 ptr
指针修改 str
字符串是否合法?
您引用的 c_str
的参考资料在这件事上非常清楚:
The program shall not modify any of the values stored in the character array; otherwise, the behavior is undefined.
它恰好有效并不意味着什么。未定义的行为意味着程序可以根据需要做“正确”的事情。
如果您确实想要修改基础数据,您可以使用 data()
的 non-const 重载,它可从 C++17 获得,它允许您修改除 null-terminator:
The program shall not modify the value stored at p + size() to any value other than charT(); otherwise, the behavior is undefined.
我遇到了一些代码,其中包含以下示例的多个实例:
std::string str = "This is my string";
char* ptr = const_cast<char*>(str.c_str());
ptr[5] = 'w';
ptr[6] = 'a';
在这个简化的示例中,使用 const_cast
.[=25 将 std::string::c_str()
returns const char*
赋值给 char*
指针=]
这似乎按预期工作,str
已相应修改。
但是我当地图书馆对std::string::c_str()
的描述是这样的:
Return const pointer to null-terminated contents. This is a handle to internal data. Do not modify or dire things may happen.
并且在 cppreference 中的描述包括:
Returns a pointer to a null-terminated character array with data equivalent to those stored in the string.
...
Writing to the character array accessed through
c_str()
is undefined behavior.
在标准 [string.accessors] 中,描述是相似的,没有关于此的信息 ...空终止字符数组,其数据等同于存储在字符串中的数据... 已提供。
这没有澄清问题,反而让我更加困惑,什么字符数组?怎样才算等价?是副本吗?如果是这样,为什么要修改它,还要修改原始字符串?这个实现有定义吗?
我想避免更改使用它的所有代码实例的任务,所以我的问题是:
有什么方法可以纠正吗,使用 ptr
指针修改 str
字符串是否合法?
您引用的 c_str
的参考资料在这件事上非常清楚:
The program shall not modify any of the values stored in the character array; otherwise, the behavior is undefined.
它恰好有效并不意味着什么。未定义的行为意味着程序可以根据需要做“正确”的事情。
如果您确实想要修改基础数据,您可以使用 data()
的 non-const 重载,它可从 C++17 获得,它允许您修改除 null-terminator:
The program shall not modify the value stored at p + size() to any value other than charT(); otherwise, the behavior is undefined.