如何将& str转换为* const u8?

时间:2018-03-09 23:14:36

标签: rust

我有一个功能

extern "C" {
    fn log_impl(ptr: *const u8);
}

fn log(s: &str) {
    log_impl(s.as_bytes() as *const u8);
}

这给了我以下错误:

error[E0606]: casting `&[u8]` as `*const u8` is invalid
 --> src/main.rs:6:14
  |
6 |     log_impl(s.as_bytes() as *const u8);
  |              ^^^^^^^^^^^^^^^^^^^^^^^^^

与我尝试做的最相似的问题是 Converting a str to a &[u8]

2 个答案:

答案 0 :(得分:3)

Rust字符串不像大多数C函数所期望的那样终止NUL。您可以使用&str或使用*const u8&s.as_bytes()[0] as *const u8转换为s.as_ptr(),但这对于传递给任何期望以NUL终止的字符串的C函数无效。

相反,您可能需要使用CString将字符串复制到缓冲区并在末尾添加NUL终结符。这是一个假设log_impl不存储指向字符串的指针的示例:

fn log(s: &str) {
    unsafe {
        let c_str = CString::new(s).unwrap();
        log_impl(c_str.as_ptr() as *const u8);
    }
}

答案 1 :(得分:0)

&[u8]在Rust中称为切片,*u8是原始指针。您可以使用from_ptr()as_ptr()在两种类型之间来回切换。

extern "C" {
    fn log_impl(ptr: *const u8);
}

fn log(s: &str) {
    log_impl(s.as_bytes().as_ptr() as *const u8);
}