我有一个功能
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]
答案 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);
}