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

Spe*_*ath 4 rust

我有一个功能

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

fn log(s: &str) {
    log_impl(s.as_bytes() as *const u8);
}
Run Code Online (Sandbox Code Playgroud)

这给了我以下错误:

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

fn log(s: &str) {
    log_impl(s.as_bytes() as *const u8);
}
Run Code Online (Sandbox Code Playgroud)

与我要执行的操作最相似的问题是 将str转换为&[u8]

Jor*_*ner 5

像大多数C函数所期望的那样,Rust字符串不是NUL终止的。你可以转换&str*const u8使用&s.as_bytes()[0] as *const u8或使用s.as_ptr(),但不会是有效的传递给任何C函数期待一个NUL结尾的字符串。

相反,您可能需要使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 此功能可能不需要标记为“不安全”,而应在内部使用“不安全”块。 (3认同)