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;
}
另见:


在切片转换之前,我检查了“buf”的大小,得到了(比如)“x”。在转换之后,我仍然得到buf的长度等于“x”?您的评论肯定会帮助一些人,但对我来说,解决方案并不适合该场景。我必须调试其他人的API。。。下面是一个定期调用的函数,用于重新对齐网络缓冲区:
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问题