分配字符串 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 的引用(前提是字符串不为空,否则返回值未定义)。您正在将该 charvalue 类型转换为指针。因此,当您的代码尝试使用指针访问无效的内存地址时,它会崩溃。您需要键入该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&lt;uint8_t*&gt;(const_cast&lt;char*&gt;(data1.c_str())); 此外,在 C++11 之前,不能保证 c_str() 实际上返回指向 std::string 内部数据的指针(尽管为了简单起见,这是一个常见的实现)。 C++11 以后保证它。 C++17 后来添加了一个非const 版本的data() 方法:data = reinterpret_cast&lt;uint8_t*&gt;(data1.data());【参考方案3】:

例如,如果您正在执行以下操作:

std::string data1 = "One"

然后 data1[0] 给出 'O',其 ASCII 值为 79。 现在你用这个 79 作为地址。

所以,名为 data 的指针的值是 79。

因此,当您再次在代码中使用此指针时,您实际上是在尝试读取或写入受保护的内存(0x0000004F 或 79)。因此,它会在运行时崩溃。

【讨论】:

以上是关于分配字符串 uint8_t的主要内容,如果未能解决你的问题,请参考以下文章

uint8_t 与无符号字符

如何将字符数组转换为 uint8_t

如何将 uint8_t 数组与 C 中的字符串进行比较?

为啥 uint8_t 在分配给取消引用的 uint32_t 指针时使用了 4 个字节?

如何将 stringstream 十六进制字符串字符对转换为单个 uint8_t 等效二进制值

如何在 C++ 中将 uint8_t 的向量转换为 std::string?