如何不安全地增加可变字节片的大小?

时间:2019-05-09 03:06:08

标签: 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 {
        /* ??? */
    }
}

即使是参数,如何调整数组buf的大小?这种方法很有必要。

1 个答案:

答案 0 :(得分:2)

您正在尝试做的是-但要确保导致该行为不确定的保证找到更好的API


如果您希望更改在功能的外部中反映出来,那么您很不走运。出于同样的原因,fn foo(x: i32)不允许您更改调用者观察到的值。

如果仅在函数内部需要此功能,请使用slice::from_raw_parts。我将整个函数标记为unsafe,因为某些输入将导致未定义的行为,并且此代码可能无法防范它:

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,则类似的方法可以将更改显示在函数外部:

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;
}

另请参阅: