【问题标题】:Cast C struct double pointer to a Swift struct unsafe pointer将 C 结构双指针转换为 Swift 结构不安全指针
【发布时间】:2018-07-02 14:25:00
【问题描述】:

我需要在 Swift (4) 中进行以下 C 转换:

struct A ** castme = input
struct B * tothis = (struct B *)castme

在 Swift 中,castme 类型是 UnsafeMutablePointer<UnsafeMutablePointer<A>?>!

我假设我正在尝试转换为 UnsafeMutablePointer<B>!

另外,说我也可以将*(castme) 直接转换为(struct B) 是否正确?如果是,通过从 UnsafeMutablePointer<A>? 转换为 B 是否会使转换更容易?

我看到了这个帖子,但无法从中得到我需要的东西: Cast to different C struct unsafe pointer in Swift

【问题讨论】:

  • 嗯,将 指向指针的指针 投射到 struct 指针在 C 中也是不安全的,如此处所述。需要查看更多代码了解详情。

标签: c swift


【解决方案1】:

让我们考虑一下 C 中发生的事情。当我在 C 中进行指针转换时,表示指针类型的数据现在将被视为不同类型的指针。指针的值不会改变,只是你如何对待它。

Swift 不喜欢做这种事情,也不鼓励你这样做,因为它虽然便宜,但从根本上讲是不安全的事情,并且可能导致数据损坏、跳入太空、总线错误等。

这并不意味着 swift 没有能力做到这一点。您指向的链接使用withUnsafePointerTo,它试图限制指针的使用范围。在您的情况下,您可能想查看模仿 C 指针转换的 unsafeBitCast(文档 here)(它与一般的 C 转换并不完全相同,但对于指针来说却是)。

let a:UnsafeMutablePointer<SomeType> = fetchASomeTypePointer()
let b = unsafeBitCast(a, to: UnsafeMutablePointer<SomeOtherType>.self)

这使得表示指向SomeType 的指针的数据现在变成了指向SomeOtherType 的指针。

就像我之前说的,这是一件很危险的事情,尤其是在你不完全了解自己在做什么的情况下。

【讨论】:

    猜你喜欢
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 2011-09-15
    • 2011-11-30
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多