You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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指向的数组内存,避免内存泄漏
  • 对应你使用的Z3场景,把NativeStructType替换为Z3_func_decl即可正常读取proj_decl的输出内容。

内容的提问来源于stack exchange,提问作者user2852699

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:18:00