在Rust中能否将单个值的可变引用传入接收切片的函数?
Rust中安全实现类似C的单值切片修改操作
先看你给出的C语言实现:
// Returns the number of bytes written int write_to_buffer(int buffer[]) { buffer[0] = 1234; return 1; } int main() { int value = 0; int num_bytes = write_to_buffer(&value); // `value` now has the value of 1234 }
在C里,数组参数会退化为指针,单个变量的地址可以被当作长度为1的数组指针传入,从而修改变量值。
在Rust中完全可以安全实现类似逻辑,核心是用标准库的std::slice::from_mut函数,它能把单个可变引用转换成长度为1的可变切片&mut [T],示例代码如下:
/// 返回写入的元素个数 fn write_to_buffer(buffer: &mut [i32]) -> usize { if !buffer.is_empty() { buffer[0] = 1234; 1 } else { 0 } } fn main() { let mut value = 0; // 将单个可变引用转为长度为1的可变切片 let num_elements = write_to_buffer(std::slice::from_mut(&mut value)); println!("value now has the value of {}", value); // 输出 1234 }
补充说明:
std::slice::from_mut是安全的标准库函数,保证生成的切片指向有效的单个元素,不存在越界风险- 函数里增加了切片非空检查,避免空切片访问
buffer[0]触发panic,提升代码健壮性 - 如果需要对应C中的字节数,可以用
std::mem::size_of::<i32>() * num_elements计算总写入字节数
内容的提问来源于stack exchange,提问作者ClydeTheGhost
相关产品推荐
相关产品推荐

