Rust 如何获取可变u32指针并将其转换为C的int指针
假设我有一个C函数:Rust 如何获取可变u32指针并将其转换为C的int指针,rust,ffi,Rust,Ffi,假设我有一个C函数: void func(char *buf, unsigned int *len); 为了称之为生锈,我宣布: pub fn func(buf: *mut ::std::os::raw::c_char, len: *mut ::std::os::raw::c_uint) { unimplemented!() } 然后我写了另一个包装: pub fn another_func() -> String { let mut capacity: u32 = 2
void func(char *buf, unsigned int *len);
为了称之为生锈,我宣布:
pub fn func(buf: *mut ::std::os::raw::c_char, len: *mut ::std::os::raw::c_uint) {
unimplemented!()
}
然后我写了另一个包装:
pub fn another_func() -> String {
let mut capacity: u32 = 256;
let mut vec = Vec::with_capacity(capacity as usize);
unsafe {
func(vec.as_ptr() as *mut c_char, &capacity as *mut c_uint)
};
String::from_utf8(vec).unwrap();
unimplemented!()
}
但是编译器告诉我:
错误[E0606]:将`&u32`转换为`*mut u32`无效
-->src/main.rs:…:28
|
307 |和容量为*多个单元)
为什么我不能将
容量
转换为*多个c_单元
?我必须使参考可变
func(vec.as_ptr() as *mut c_char, &mut capacity as *mut c_uint)
请注意,在这种情况下不需要
不安全的
,因为将某些内容强制转换到指针中是完全安全的,但取消引用指针是不安全的。第二个注意:对于C中的大小(数组的大小),您应该接受大小而不是无符号int
。请参见第三个注意:您必须使用.[no\mangle]
禁用名称篡改,以便能够从C调用它。第四个注意事项:我怀疑您想要修改func
函数中的vec
。确保使用set_len
(这是不安全的)设置Vec
@hellow Thank man的长度。对于第二个:实际上我在这里需要uint32,但是我不想在api头中包含太多的头,比如stdint.h
<代码>大小\u t
可能很长,比uint32\u t长,不适合。