2014-10-28 60 views
0

我记得有一个函数array_each,但现在不推荐使用。这是用另一个功能取代吗?如果没有,我怎么能使用C指针作为一个数组的锈迹阵列?处理C的空终止指针(ffi)

extern { 
    fn testing() -> *MyList 
} 

#[repr(C)] 
struct MyList; 

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

回答

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现在)

+0

的std :: c_vec :: CVec不复存在:-( – ferrouswheel 2015-09-06 02:18:58

+1

@ferrouswheel更新!c_vec已被RFC 494,FYI删除。 – 2015-09-07 06:50:30