如何使用C函数填充Rust中未初始化的Vector
问题原因
Rust 中Vec的capacity和len是两个独立的属性:
Vec::with_capacity()仅申请对应大小的堆内存,不会修改len值,此时返回的Vec的len为0,后续读取操作只会访问0..len范围内的元素,超出部分会被判定为未初始化内存- 你通过C函数向申请的内存空间写入了
len个有效值,但没有主动更新Vec的len属性,最终读取时拿到的就是未初始化的垃圾值,同时属于未定义行为。
修复方案
最简单的修复方式是在C函数调用完成后,手动调用set_len()方法标记有效元素的长度:
fn get_ui_vector(len: c_long) -> Vec<c_ulong> { let mut out = Vec::<c_ulong>::with_capacity(len as usize); unsafe { get_ui_array(out.as_mut_ptr(), len); // 新增:标记前len个元素已经完成初始化 out.set_len(len as usize); } out }
使用该方案需要确保C函数确实成功初始化了全部len个元素,否则仍会触发未定义行为。
如果需要更严谨的未初始化内存管理,可以使用MaybeUninit明确标记内存状态:
use std::mem::MaybeUninit; use std::os::raw::{c_long, c_ulong}; fn get_ui_vector(len: c_long) -> Vec<c_ulong> { let len_usize = len as usize; // 申请未初始化的内存空间 let mut buf: Vec<MaybeUninit<c_ulong>> = Vec::with_capacity(len_usize); unsafe { get_ui_array(buf.as_mut_ptr() as *mut c_ulong, len); // 标记所有元素已完成初始化 buf.set_len(len_usize); // 转换为已初始化的Vec返回 std::mem::transmute(buf) } }
你之前使用MaybeUninit和from_raw_parts仍然出错,大概率也是没有正确完成内存初始化后的长度标记流程导致的。
内容的提问来源于stack exchange,提问作者wyoumans
相关产品推荐
相关产品推荐

