簡體   English   中英

將C結構雙指針轉換為Swift結構不安全指針

[英]Cast C struct double pointer to a Swift struct unsafe pointer

我需要在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>?進行鑄造是否會使鑄造更容易UnsafeMutablePointer<A>? B嗎?

我看到了該線程,但無法從中獲取所需信息: 在Swift中強制轉換為其他C結構不安全指針

讓我們考慮一下C中發生的情況。當我在C中進行指針轉換時,表示指針類型的數據現在將被視為其他類型的指針。 指針的值不會改變,只是您如何對待它。

Swift不喜歡這樣做,也不鼓勵您這樣做,因為盡管價格便宜,但這樣做從根本上是不安全的,並且可能導致數據損壞,跳入空間,總線錯誤等。

這並不意味着swift無法執行此操作。 您指向的鏈接與withUnsafePointerTo一起使用,它試圖限制指針的使用范圍。 在您的情況下,您可能需要查看模仿C指針unsafeBitCast此處的文檔)(通常,它與C強制轉換嚴格不相同,但對於指針來說確實如此)。

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

這使得表示指向SomeType的指針的數據現在變為指向SomeOtherType的指針。

如我之前所說,這是一件危險的事情,尤其是如果您不完全了解自己在做什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM