我有这个功能:
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
的大小?这种方法很有必要。
答案 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;
}
另请参阅: