在ffi教程和自动生成的界面中,大部分时间都使用*const T个指针.据我所知,&T*const T之间的区别只是*const T不必满足某些条件,比如不为空,并且对解引用不安全.

fn main() {
    unsafe {
        do_something(&TestStruct {data: 3})
    }
}

#[repr(C)]
pub struct TestStruct {
    data: u32
}

extern "C" {
    fn do_something(arg: &TestStruct);
}

这段代码可以编译并运行.因为外部函数和内部函数在用法上相似,我不明白为什么原始指针被用作默认值.

推荐答案

答案的一个要素可能是references must be aligned.由于使用未对齐的引用是未定义的行为,并且在FFI中无法保证指针的对齐,因此默认使用指针似乎是明智的 Select

Rust相关问答推荐

为什么是!为Rust中的RwLockReadGuard和RwLockWriteGuard实现的发送特征?

为什么要在WASM库中查看Rust函数需要`#[no_mangle]`?

在特征中使用Async时,如何解决不透明类型`impl Future<;out=self>;`不满足其关联的类型边界和警告?

在跨平台应用程序中使用std::OS::Linux和std::OS::Windows

带参考文献的 rust 元组解构

在我的Cargo 中,当我在建筑物中使用时,找不到我可以在产品包中使用的 crate .r我如何解决这个问题?

如何使用RefCell::JOYMOMTborrow 对 struct 不同字段的可变引用

Trait bound i8:来自u8的不满意

失真图像图形捕获Api

对于rustc编译的RISC-V32IM二进制文件,llvm objdump没有输出

在 Rust 中用问号传播错误时对类型转换的困惑?

为什么`tokio::main`可以直接使用而不需要任何导入?

如何重命名 clap_derive 中的子命令占位符?

Rust 中的静态引用

为什么Rust中无法推断生命周期?

使用 serde_json 进一步处理字段

如何断言代码不会在测试中编译?

为什么当borrow 变量发生变化时,borrow 变量不会改变?

返回引用的返回函数

类型参数不受 impl 特征、自身类型或谓词的约束