std::string 到 unsigned char[] 和 unsigned char* 有什么不同?
What's the different about std::string to unsigned char[] and unsigned char*?
我从文件中获得一个字符串,并将该字符串转换为unsingnedchar[]。这是我的代码:
unsigned char c[16];
std::string message = ReadFile(); // get string from file
strcpy((char*)c,message.c_str());
并将字符串转换为unsigned char*
unsigned char* c;
std::string message = ReadFile(); // get string from file
c = (unsigned char*)message.c_str();
我不明白他们有什么不同。它们是一样的吗? 基础知识
unsigned char c[16]
: c
是一个包含16个unsigned char
的数组。
unsigned char* c
: c
是指向unsigned char
的指针(可能指向unsigned char
的连续序列(长度未知)的开始)
std::string s
: s
是一个字符串对象,它内部保存一个连续的字符序列,这些字符的长度可以动态变化。string对象还保存字符串的当前长度。
第一个代码示例
在这里,创建一个16个字符的缓冲区,然后创建一个std::string
对象,用ReadFile
调用的结果填充它。
然后请求std::string
对象的C-string (null终止)表示,并使用strcpy
将其复制到16个字符的缓冲区中。不幸的是,您没有检查大小,因此很可能超出缓冲区的末尾,并误入未定义的行为。不要这样做现在您有两个数据副本;一个在std::string
中,一个(部分)复制在16字符数组中。
第二个代码示例
在第二个示例中,您再次将ReadFile
调用的结果赋值给std::string
,并再次调用c_str()
成员函数来请求以空结尾的c字符串表示。这一次,您只需强制转换结果指针,使其类型为unsigned char*
,并将其赋值给已声明的指针。你只有一个数据副本,并且没有缓冲区溢出。
但是,如果字符串的内容改变,指针c
可能会失效。
指南
如果可能,直接使用
std::string
。避免传递char*
或使用char
的数组,因为std::string
会跟踪大小,根据需要调整大小,并为您处理内存分配。不要做第一个版本。这是不安全的,因为你没有检查边界
避免第二个版本;如果你有一个接受C-string的函数,只需将
s.c_str()
的结果直接作为参数给它:void my_func(const char * str); // ... std::string s = "Hello"; my_func(s.c_str()); // This is fine!
s
具有局部作用域,即对my_func
或my_func
可以调用的任何东西的直接操作不可见。对s
的任何修改都可能使s.c_str()
返回的指针失效。[/p>如果你真的需要一个字符串内容的副本,只要在你做任何改变之前把它赋值给另一个字符串:
std::string s1 = "Hello"; std::string s2 = s1; // copy the string s1 = "Goodbye"; my_func(s2.c_str()); // still "Hello".
不,它们不一样。首先,将message
的内容复制到c
中。在第二-你只是分配指针,返回c_str
到c
。因此,当消息将被更改或销毁时,您将在c
中拥有垃圾。
在第一个示例中,字符串的内容被复制到数组中(尽管16对于文件缓冲区来说是相当短的长度)。现在你有两个不同的容器保存相同的数据。
在第二个示例中,读入字符串,然后将其容器的地址传递给指针。因此,指针将指向与字符串相同的数据。但是,您不能将const char *类型转换为非const类型,因此您的示例可能无法编译。
首先转换为c风格数组有什么原因吗?
- 如何使用多次 memcpy 转换回 std::vector<unsigned char>?
- 错误:从'void*'到'const uint8_t* {aka const unsigned char*}'的转换无效 [-允许]
- C++ - 从 "int" 到 "unsigned char" 的缩小转换无效
- 让 'std::vector<unsigned char>' 从 'std::string' 中窃取内存
- 无法从'unsigned short [9]'转换为'char []'
- 使用外部变量会导致"unsigned char"错误LNK2001
- CPPrestsdk (Casablanca) JSON 值到 std::vector<unsigned char>
- memcpy unsigned char to int
- 有没有办法将 vector<unsigned char> 插入 postgresql 表中,具有 bytea 属性,没有 UTF8 编码错误?
- 没有匹配函数来调用"std::basic_ofstream<char>::write(std::string*, long long unsigned int)"
- 将数据从 vector<unsigned char> 传输到无符号 char[]
- 如何修复此 OpenCV 错误:断言失败((无符号)i < (无符号)cn) 在 cv::Vec<unsigned char,3>:::运算符 (), 文件
- 你什么时候会使用"signed char"而不是"unsigned char"?
- 错误:初始化时无法将'const unsigned char (*)[7]'转换为'const unsigned char (*)[]'
- 如何将std :: string传递到C 中的const unsigned char **
- 类型 "unsigned char *" 的参数与类型 "const char *" 的参数不兼容
- C 如何在功能调用中从char *转换为unsigned char *
- 从'byte* {aka unsigned char*}'到'dword {aka长unsigned int}'失去精度
- 'unsigned short var'与'unsigned char var [2]' C++
- C++ cast char * to unsigned char