我有一个功能
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]。
像大多数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)
| 归档时间: |
|
| 查看次数: |
2234 次 |
| 最近记录: |