处理 C 的空终止指针 (ffi)

  • 本文关键字:ffi 指针 终止 处理 c rust
  • 更新时间 :
  • 英文 :


我记得有一个函数array_each,但现在已经弃用了。这是用另一个功能取代的吗?如果没有,我如何将指向数组的C指针用作rust数组?

extern {
  fn testing() -> *MyList
}
#[repr(C)]
struct MyList;
fn main() {
  unsafe {
    let list = testing();
    // would like to iterate through the list here
  }
}

使用std::slice::from_raw_parts:

extern {
    fn get_some_list(len: *mut u32) -> *mut u32;
}
fn main() {
    use std::slice;
    unsafe {
        let mut len: u32 = 0;
        let ptr: *mut u32 = get_some_list(&mut len);
        assert!(!ptr.is_null());
        let view: &[u32] = slice::from_raw_parts(ptr, len as usize);
        for &v in view.iter() { println!("{}", v); }
    }
}

生成的切片可能具有任意的寿命(包括'static),因此要小心将该切片暴露在安全的外部。

(注意:您的原始代码使用了一些旧语法,我在这个答案中已经修复了这些语法。例如,您现在需要在*之后使用constmut。)

最新更新