我有一个期望接受 *const std::os::raw::c_char
的C函数,而我在Rust中已经这样做了:
use std::os::raw::c_char;
use std::ffi::{CString, CStr};
extern crate libc;
fn main() {
let _test_str: *const c_char = CString::new("Hello World").unwrap().as_ptr();
let fmt: *const c_char = CString::new("%s\n").unwrap().as_ptr();
unsafe { libc::printf(fmt, _test_str); }
unsafe {
let slice = CStr::from_ptr(_test_str);
println!("string buffer size without nul terminator: {}", slice.to_bytes().len());
}
}
然而,我无法使
_test_str
打印出来,上述程序的输出仅为:string buffer size without nul terminator: 0
如果我将
_test_str
传递给某个C函数,发现它是一个空字符串,那么我做错了什么?
as_ptr
函数的子部分说明会看到警告。我的错,但是“鲁莽”太过了。无论如何感谢你指出参考资料。此外,你指出的问题更为冗长,难以抓住关键点。 - xxks-kkkunsafe
代码,并包括在解引用它们之前阅读返回原始指针的函数的文档。至于重复问题,我同意,那个问题有点冗长。实际上,如何在使用as_ptr()
时停止内存泄漏?可能更好。然而,我只有一个关闭投票,所以现在无法更改。 - trent