gpt4 book ai didi

memory - 如何不安全地增加可变 byte slice 的大小?

转载 作者:行者123 更新时间:2023-11-29 08:36:22 24 4
gpt4 key购买 nike

我有这个功能:

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 的大小,即使它是一个参数?这种方法是必要的。

最佳答案

您尝试执行的操作肯定会导致未定义的行为。 寻找更好的 API


如果您希望更改反射(reflect)在函数的外部,那您就不走运了。此函数签名不可能允许这种情况发生,原因与 fn foo(x: i32) 不允许您更改调用者观察到的传入值的原因相同。

如果您只需要在函数内部使用 this,请使用 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;
}

另见:

关于memory - 如何不安全地增加可变 byte slice 的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56051611/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com