Memory 如何不安全地增加可变字节片的大小?
我有这个功能:Memory 如何不安全地增加可变字节片的大小?,memory,rust,slice,Memory,Rust,Slice,我有这个功能: use std::io; pub fn recv(mut buf: &mut [u8]) -> io::Result<usize> { let size_to_extend = 50; // I want to increase the size of "buf" by 50 unsafe { /* ??? */ } } pub unsafe fn recv(buf: &mut &mut [u8
use std::io;
pub fn recv(mut buf: &mut [u8]) -> io::Result<usize> {
let size_to_extend = 50; // I want to increase the size of "buf" by 50
unsafe {
/* ??? */
}
}
pub unsafe fn recv(buf: &mut &mut [u8]) {
let size_to_extend = 50;
let ptr = buf.as_mut_ptr();
let len = buf.len();
let bad_idea = slice::from_raw_parts_mut(ptr, len + size_to_extend);
for b in bad_idea.iter_mut() {
*b = 10;
}
*buf = bad_idea;
}
使用std::io;
发布fn recv(mut buf:&mut[u8])->io::Result{
让size_to_extend=50;//我想将“buf”的大小增加50
不安全{
/* ??? */
}
}
如何调整数组
buf
的大小,即使它是一个参数?必须使用此方法。您尝试执行的操作几乎保证会导致未定义的行为。找到更好的API
如果您希望这些更改反映在函数之外,那么您就太倒霉了。此函数签名不可能允许这种情况发生,原因与
fn foo(x:i32)
不允许更改调用方观察到的传入值相同
如果您只需要在函数内部使用它,请使用。我已将整个函数标记为不安全,因为某些输入将导致未定义的行为,而此代码可能无法防范:
use std::slice;
pub unsafe fn recv(buf: &mut [u8]) {
let size_to_extend = 50;
let ptr = buf.as_mut_ptr();
let len = buf.len();
let bad_idea = slice::from_raw_parts_mut(ptr, len + size_to_extend);
for b in bad_idea.iter_mut() {
*b = 10;
}
}
如果您可以更改API,则类似这样的操作可以在函数外部公开更改:
use std::io;
pub fn recv(mut buf: &mut [u8]) -> io::Result<usize> {
let size_to_extend = 50; // I want to increase the size of "buf" by 50
unsafe {
/* ??? */
}
}
pub unsafe fn recv(buf: &mut &mut [u8]) {
let size_to_extend = 50;
let ptr = buf.as_mut_ptr();
let len = buf.len();
let bad_idea = slice::from_raw_parts_mut(ptr, len + size_to_extend);
for b in bad_idea.iter_mut() {
*b = 10;
}
*buf = bad_idea;
}
另见:
code impl AsyncRead for KcpStream{safe fn prepare_uninitialized_buffer(&self,mut m:&mut[u8])->bool{println!(“Prepping unit buffer!”;false}fn read_buf(&mut self,buf:&mut B)->Poll{::read buf(&mut&*self,buf)}
发生的情况是,缓冲区的容量从约8000字节降至80字节,然后它将无法接受更多的数据。因此,我需要以某种方式调整缓冲区的大小。我似乎无法找到缓冲区的初始化位置……您是否尝试分配新的缓冲区?或者使用例如?此时,我认为无法强制恢复设定缓冲区的长度。过去35个小时我一直在尝试。哦,好吧,至少我会因为问一个该死的问题而丢分,特别是看起来像xy问题