gpt4 book ai didi

将 C 结构双指针转换为 Swift 结构不安全指针

转载 作者:太空宇宙 更新时间:2023-11-04 07:54:33 24 4
gpt4 key购买 nike

我需要在 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

最佳答案

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

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

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

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

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

就像我之前说的,这是一件危险的事情,尤其是当您不完全了解自己在做什么的时候。

关于将 C 结构双指针转换为 Swift 结构不安全指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51138411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com