分配字符串 uint8_t
Posted
技术标签:
【中文标题】分配字符串 uint8_t【英文标题】:Assign string uint8_t 【发布时间】:2018-05-10 17:32:56 【问题描述】:我正在努力使用uint8_t*
来指向字符串的第一个字段。
这就是我的代码的样子
std::string data1
uint8_t* data
data = (uint8_t*)data1[0]
这里有什么问题?当我运行它时它崩溃了
提前致谢
【问题讨论】:
您的代码实际上不可编译 如果您必须使用演员表,您通常会做错事。 【参考方案1】:data[0]
返回对字符串中第一个char
的引用(前提是字符串不为空,否则返回值未定义)。您正在将该 char
的 value 类型转换为指针。因此,当您的代码尝试使用指针访问无效的内存地址时,它会崩溃。您需要键入该char
的地址:
data = (uint8_t*) &data1[0];
或者,以更 C++ 风格(更安全)的方式:
data = reinterpret_cast<uint8_t*>(&data1[0]);
或者,使用边界检查:
data = reinterpret_cast<uint8_t*>(&(data1.at(0)));
【讨论】:
【参考方案2】:对于你想做的你可以尝试:
data = (uint8_t*)data1.c_str();
不知道你到底想达到什么目标,但肯定有更好的方法。
【讨论】:
小心,因为c_str()
返回一个const char*
,并且您正在以C 风格而不是C++ 风格抛弃const
。 C++ 方式会更像这样:data = reinterpret_cast<uint8_t*>(const_cast<char*>(data1.c_str()));
此外,在 C++11 之前,不能保证 c_str()
实际上返回指向 std::string
内部数据的指针(尽管为了简单起见,这是一个常见的实现)。 C++11 以后保证它。 C++17 后来添加了一个非const
版本的data()
方法:data = reinterpret_cast<uint8_t*>(data1.data());
【参考方案3】:
例如,如果您正在执行以下操作:
std::string data1 = "One"
然后 data1[0] 给出 'O',其 ASCII 值为 79。 现在你用这个 79 作为地址。
所以,名为 data 的指针的值是 79。
因此,当您再次在代码中使用此指针时,您实际上是在尝试读取或写入受保护的内存(0x0000004F 或 79)。因此,它会在运行时崩溃。
【讨论】:
以上是关于分配字符串 uint8_t的主要内容,如果未能解决你的问题,请参考以下文章
为啥 uint8_t 在分配给取消引用的 uint32_t 指针时使用了 4 个字节?