Rust调用C++ API时如何将函数分配的数组指针转换为Rust数组
解决方法
你要实现这个转换需要先修正指针类型,再通过原生标准库方法完成转换,具体步骤如下:
步骤1:修正接收指针的类型
你当前定义的ptr类型有误,native_fn的第二个参数是指向「NativeStructType指针数组」的指针,因此要调整ptr的类型:
// 定义对应类型的空指针,用来接收C函数分配的数组首地址 let mut ptr: *mut *mut NativeStructType = std::ptr::null_mut(); unsafe { native_fn(2, &mut ptr); }
步骤2:指针转固定长度数组
有两种常用实现方式:
方式1:通过slice中转(推荐,兼容性好)
先把原始指针转为对应长度的slice,再转换为固定长度数组:
unsafe { // 构建长度为2的slice,需自行保证ptr非空、指向的内存确实有2个连续有效元素 let slice = std::slice::from_raw_parts(ptr, 2); // 长度编译期匹配,unwrap不会失败 let data: [*mut NativeStructType; 2] = slice.try_into().unwrap(); }
方式2:手动偏移读取
如果需要兼容旧版本Rust,也可以直接通过指针偏移读取元素构造数组:
let data: [*mut NativeStructType; 2] = unsafe { [ *ptr.offset(0), *ptr.offset(1) ] };
安全注意事项
- 所有操作必须包裹在
unsafe块中,你需要自行保证三个前提:- C函数返回后
ptr是非空有效指针 ptr指向的内存区域确实连续存储了对应数量的有效指针- 用完后需要按照C API的约定释放
ptr指向的数组内存,避免内存泄漏
- C函数返回后
- 对应你使用的Z3场景,把
NativeStructType替换为Z3_func_decl即可正常读取proj_decl的输出内容。
内容的提问来源于stack exchange,提问作者user2852699
相关产品推荐
相关产品推荐

