如何从 Rust 字符串创建 *mut u8?

3

我是一名 Rust 初学者。我想创建一个可变的 u8 缓冲区。

我尝试了以下代码:

let mut str = "hello";
let r = str as *mut u8;

但是我遇到了问题

error[E0606]: casting `&str` as `*mut u8` is invalid

我希望了解如何做,也想知道为什么。 "hello" 是什么类型?Rust中的强制转换是如何工作的?


@Stargateur谢谢。但是如果u8是一个原始类型,Vec如何创建它们的缓冲区呢?这就是我不明白的地方,也在教程中找不到答案。 - Guerlando OCs
实际上,它是一个 u8 的切片,而不是 u8。你可以通过获取 Vec 的切片的引用来获得一个。 - Ikechukwu Eze
在Vec或&Vec[..]上使用as_slice方法。 - Ikechukwu Eze
1
你想用 *mut u8 指针做什么?提供一个答案会有帮助。 - ramslök
1
如果你能提供更多的背景信息,那将会很有帮助。你想要做什么?你在这里的目标是什么?如果你对Rust还不熟悉,指针可能不是正确的答案,但是我们无法在不了解更多情况的情况下告诉你应该做什么。 - John Kugelman
2个回答

3
首先:str不需要是可变的,因为你没有对它进行改变。 其次:"hello"是&str类型(字符串切片)。 第三:你可以通过调用as_bytes()将&str转换为&[u8],这就是你所需的缓冲区。在变量名前添加mut使其可变。
   let str = "hello";
   let mut r = str.as_bytes();
   println!("{:?}", r);

我猜“hello”是字符串类型,而方法as_bytes返回一个可变的u8指针?但是如果我想创建自己的可变u8指针呢?我该如何填充它? - Guerlando OCs
6
我的编译器显示 r 的类型是 &[u8] - Guerlando OCs

0

有一个方法 str::as_mut_ptr 可以完全实现这个功能。

let mut str = "hello";
let r = str.as_mut_ptr(); // r: *mut u8

然而,如果您选择使用r,则需要负责维护str的安全不变性。引用文档(重点在我这里):

将可变字符串切片转换为原始指针。

由于字符串切片是字节的切片,原始指针指向一个u8。 此指针将指向字符串切片的第一个字节。

您有责任确保字符串切片只以一种使其仍然有效的UTF-8格式进行修改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接