首页 > 解决方案 > 如何不安全地增加可变字节片的大小?

问题描述

我有这个功能:

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即使它是一个参数,如何调整数组的大小?这种方法有必要发生。

标签: memoryrustslice

解决方案


您尝试做的几乎是保证会导致未定义的行为。寻找更好的 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;
}

也可以看看:


推荐阅读