Rust 如何从原始指针复制切片?

Rust 如何从原始指针复制切片?,rust,Rust,我正在尝试将原始指针的切片复制到新切片ss: pub fn receive(&mut self, data: *const u8, len: usize) { let s = unsafe{slice::from_raw_parts(data, len)}; let mut ss = [0, len]; ss.copy_from_slice(s); self.received.lock().unwrap().push_bac

我正在尝试将原始指针的切片复制到新切片
ss

pub fn receive(&mut self, data: *const u8, len: usize) {
        let s = unsafe{slice::from_raw_parts(data, len)};
        let mut ss = [0, len];
        ss.copy_from_slice(s);
        self.received.lock().unwrap().push_back(ss);
}

但是我在创建这个新片段时遇到了困难。我试图给出长度
len
,因此它与slice
s
兼容,但我不明白发生了什么

提供错误消息通常有助于诊断问题。提供即时可用的问题复制(例如操场上的东西)也很有用

总之,在你的功能中减少我们不知道和不关心的事情,我们得到以下结果:

使用std::slice;
fn接收(数据:*常数u8,len:usize){
设s=safe{slice::from_raw_parts(data,len)};
设mut ss=[0,len];
从_切片复制_;
}
编译结果如下:

error[E0308]: mismatched types
 --> src/lib.rs:6:28
  |
6 |         ss.copy_from_slice(s);
  |                            ^ expected `usize`, found `u8`
  |
  = note: expected reference `&[usize]`
             found reference `&[u8]`
因此,
ss
是一个
&[usize]
而不是一个
&[u8]
。奇怪的让我们显式地键入
ss
作为
和[u8]
来尝试并强制执行它,然后:

error[E0308]: mismatched types
 --> src/lib.rs:5:25
  |
5 |     let mut ss: &[u8] = [0, len];
  |                 -----   ^^^^^^^^ expected `&[u8]`, found array `[usize; 2]`
  |                 |
  |                 expected due to this
问题是:
[0,len]
不是一个片段。它是一个长度为2的数组,包含两个元素
0
len
是什么(由于
len
usize
它是
[usize;2]
。切片文字是
&[]
,数组和切片文字都不能采用运行时长度,因此需要在编译时知道长度

即使你把它做成一个切片,你也可能无法将它推入
接收的
,因为切片只是引用函数的本地数据,它将无法转义

你可能需要一个Vec

我正在尝试将原始指针的切片复制到新切片
ss

pub fn receive(&mut self, data: *const u8, len: usize) {
        let s = unsafe{slice::from_raw_parts(data, len)};
        let mut ss = [0, len];
        ss.copy_from_slice(s);
        self.received.lock().unwrap().push_back(ss);
}
没有“新切片”这类东西,切片总是指向来自其他内容的内存。如果要将现有切片复制到新位置,则需要为该位置分配数据,例如使用
Vec

让mut ss=vec![0;len];
从_切片复制_;

但是,既然您已经有一个切片(
s
),并且
self.received
push_back
方法接受切片,为什么不避免复制,只需调用
self.received.lock().unwrap().push_back(s)?< /p>什么是<代码>自己?收到< <代码> >代码> VEC < /C> > @ j.Welu-VEC没有推送,在STDLIB VECDEK和Link KEDLIST DOW中。谢谢。但是因为原始指针的函数是从C++调用的,因此原始数据所生成的切片将消失。soon@GuerlandoOCs它确实很快就会消失,但事实如此您将在函数内部创建一个临时向量。无论是哪种方式,我都希望
push_back
将数据从切片复制到
self.received
,因此您从中间副本中一无所获。对否决票好奇-我错过了什么?