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

时间:2014-10-28 06:20:53

标签: c rust

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

extern {
  fn testing() -> *MyList
}

#[repr(C)]
struct MyList;

fn main() {
  unsafe {
    let list = testing();
    // would like to iterate through the list here
  }
}

1 个答案:

答案 0 :(得分:3)

使用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之后的*。)