Rust 如何获取可变u32指针并将其转换为C的int指针

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

假设我有一个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 = 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长,不适合。