将字符串的c_str的结果强制转换为char*安全吗? 我在C++中,我使用的是一个C语言库,它有一个API,它接受一个字符*。它不接受常量char*,即使char*中的数据不会被修改

将字符串的c_str的结果强制转换为char*安全吗? 我在C++中,我使用的是一个C语言库,它有一个API,它接受一个字符*。它不接受常量char*,即使char*中的数据不会被修改,c++,c++11,C++,C++11,获取c_str的结果并将其强制转换为“char*”以用于此api是否安全 string str = "mydata"; char * cstr = const_cast<char*>(str.c_str()); c_api_lib_func(cstr); 这不安全 此代码输出动态数据 #include <iostream> using namespace std; int main() { string str = "mydata"; char *

获取c_str的结果并将其强制转换为“char*”以用于此api是否安全

string str = "mydata";
char * cstr = const_cast<char*>(str.c_str());
c_api_lib_func(cstr);
这不安全

此代码输出动态数据

#include <iostream>

using namespace std;

int main()
{
    string str = "mydata";
    char * cstr = const_cast<char*>(str.c_str());
    cstr[0] ='d';
    cout <<str << endl; 

   return 0;
}
这不安全

此代码输出动态数据

#include <iostream>

using namespace std;

int main()
{
    string str = "mydata";
    char * cstr = const_cast<char*>(str.c_str());
    cstr[0] ='d';
    cout <<str << endl; 

   return 0;
}

只要处理的是严格的只读,它就不会有任何危害。

只要处理的是严格的只读,它就不会有任何危害。

是的,只要传递给它的函数不试图修改字符串的内容,它是安全的

您甚至可以使用

请注意,对于C++11之前的编译器,这在技术上是不安全的,因为std::string不需要为其内部缓冲区提供连续存储


使用&str[0],函数甚至可以修改字符串内部缓冲区的内容,只要它离开缓冲区。

是的,只要您将其传递给的函数不尝试修改字符串的内容,它是安全的

您甚至可以使用

请注意,对于C++11之前的编译器,这在技术上是不安全的,因为std::string不需要为其内部缓冲区提供连续存储



使用&str[0],该函数甚至可以修改字符串内部缓冲区的内容,只要它离开。

@billz,多亏了它,我认为这是不安全的,因为您并不总是知道c_api_lib_func中发生了什么,它必须是其他人的库或api。因为如果api是我们自己编写的,我们可以将参数更改为const char*。您应该说强制转换本身是安全的,但稍后修改它是未定义的行为。@michaeltang不能修改它并不意味着您不能理解它。@hobbs,有时我们只能获取头文件和库,我们无法获取源文件code@billz,谢谢,我认为这是不安全的,因为您并不总是知道c_api_lib_func中发生了什么,它必须是其他人的库或api。因为如果api是我们自己编写的,我们可以将参数更改为const char*。您应该说强制转换本身是安全的,但稍后修改它是未定义的行为。@michaeltang不能修改它并不意味着您不能理解它。@hobbs,有时我们只能得到头文件和库,我们无法获取源代码我认为这是不安全的,因为您并不总是知道c_api_lib_func中发生了什么,它必须是其他人的库或api。因为如果api是我们自己编写的,我们可以将参数更改为const char*。我认为这是不安全的,因为您并不总是知道c_api_lib_func中发生了什么,它必须是其他人的库或api。因为如果api是我们自己编写的,我们可以将param改为const char*。我在C++11 N3337中看不到任何要求,实际上&str[0]指向以null结尾的字符串。@Matt查看[string.access]和[string.accessors]。第一个表示运算符[]size返回一个图表,第二个要求c_str+i或data+i获得的指针在数值上等于&operator[]i在[0,size]范围内获得的指针。请注意,这是一个封闭的范围。在调用数据之前,运算符[]可能有一些黄鼠狼的空间size可以在其他地方引用char,但实际上这样做是一个非常反常的实现。然而,[string.cons]13小心地将数据描述为指向n个元素的数组,而不是n+1。[string.cons]6与此类似。也许这些部分是疏忽。@Matt,但在这种情况下,如果您先调用运算符[]size,存储该地址,然后将其与data+size进行比较,指针将不相等。不过,我真希望这个标准对整个事情能更明确一点。即使不能修改终止NULL的规则也很愚蠢,应该是不能将其设置为值初始化图表以外的其他值。好的,我现在确信:我想委员会还有比这一部分更重要的事情要做。我看不到C++11 N3337中的任何要求,实际上&str[0]指向以null结尾的字符串。@请查看[string.access]和[string.accessors]。第一个表示运算符[]size返回一个图表,第二个要求c_str+i或data+i获得的指针在数值上等于&operator[]i在[0,size]范围内获得的指针。请注意,这是一个封闭的范围。在调用数据之前,运算符[]可能有一些黄鼠狼的空间size可以在其他地方引用char,但实际上这样做是一个非常反常的实现。然而,[string.cons]13小心地将数据描述为指向n个元素的数组,而不是n+1。[string.cons]6与此类似。“也许这些部分是疏忽了。@马特,但如果你打电话给接线员[]s
首先,存储该地址,然后将其与指针不相等的数据+大小进行比较。不过,我真希望这个标准对整个事情能更明确一点。即使不能修改终止NULL的规则也很愚蠢,应该是不能将其设置为值初始化图表以外的其他值。好了,我现在确信了:我想委员会还有比这一部分更重要的事情要做。