memory - 如何不安全地增加可变字节片的大小?
问题描述
我有这个功能:
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。
如果您希望更改反映在函数之外,那么您就不走运了。此函数签名不可能允许这种情况发生,原因与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;
}
也可以看看:
推荐阅读
- github - 我可以修改拉取请求的“比较分支”吗?
- linux - 如何将变量值从循环 A 更新到另一个循环 B - 在 bash
- javascript - 这两个 javascript 和 jquery 语句有什么区别?
- c - C中Heap实现中的BubbleUp方法
- ios - 如何在取消时关闭滑动操作上下文菜单
- scala - 返回 Option[DataFrame] 其中 isDefined 为 false
- python - 熊猫数据框输出错误的计算
- html - 如何创建在下拉菜单中显示所有用户数据的 for 循环?
- python-3.x - 我如何按从活跃到不活跃的顺序显示最活跃的人
- jogl - 从 yaourt 安装 jogl 正在尝试访问 jogamp.org