【发布时间】:2019-06-15 18:37:25
【问题描述】:
我在我的代码中定义了这个结构:
#[repr(align(4))]
struct MetaDataDefn {
cncVersion: i32,
toDriverBufferLength: i32,
toClientsBufferLength: i32,
counterMetadataBufferLength: i32,
counterValuesBuferLength: i32,
clientLivenessTimeout: i64,
startTimestamp: i64,
pid: i64
}
我有一个函数,它将原始指针指向一块内存,其中第一个字节对应于具有相同布局的结构。 我认为如果我将 u8 指针转换为结构指针,我会得到与在 C++ 中执行 reinterpret_cast 相同的结果。但是,我认为情况并非如此,我对这里发生的事情有点困惑。这是函数体(函数接收的指针是cncFilePtr):
let metadata = unsafe { cncFilePtr as *mut MetaDataDefn };
// This works
let cncVersion = unsafe { (*(cncFilePtr as *mut i32)) };
println!("CNC Version: {}", cncVersion);
//This prints a different number than the previous code
println!("CNC version (other way): {}", unsafe { (*metadata).cncVersion });
如您所见,将前 4 个字节转换为 i32,然后打印结果与将整个内容转换为 MetaDataDefn 并访问第一个成员(类型为 i32)不同(我的理解是这两种方法应该给出相同的结果)
我的问题是:为什么结果不一样? Rust 中的指针转换与 C++ 中的 reinterpret_cast 不同吗(我来自 C++ 背景)?
【问题讨论】:
-
你为什么要这样做?由于这样的原因,强烈不鼓励在 Rust 中使用原始指针。
-
如果不使用原始指针,您如何处理外部内存(例如,来自内存映射文件)?
-
同
static castvsreinterpret cast
标签: pointers struct rust unsafe