【问题标题】:i dont get the unsafe pointer in swift我没有迅速得到不安全的指针
【发布时间】:2019-12-03 07:36:53
【问题描述】:

我在 swift 中使用了一个 api,它为我提供了一个将数据发送到某个目的地的函数,该函数有一个 UnsafeMutablePointer 类型的参数。 astruct 是一个结构体,具有三个变量,第一个是数据,即 UnsafePointer 类型,第二个是要发送的 uint32 类型的字节,目标是第三个。

现在的问题是如何使用这个函数,如何给这些变量调用函数并初始化结构。

我要发送的数据是一个数组 [0xf0,0xf7,0x03,0x01]。 我现在该怎么办?不能接受数组作为 astruct 中的数据,它应该是 UnsafePointer,我阅读了关于 UnsafePointer 的文档,但我不太明白,有人可以帮我吗??

// swift api

func senddata (_ req: UnsafeMutablePointer < astruct >) -> OSStatus

struct astruct {
  var data : UnsafePointer < UInt8 > 
  var bytestosend : UInt32
  var destination : destination
}

var array : [UInt8] = [0xf0,0xf7,0x03,0x01]
var st = astruct(data : array , bytestosend : UInt32(array.count) , destination: dest)
senddata ( st )

如何做不安全的足尖动作?

【问题讨论】:

  • 作为对潜在回答者的礼貌,请正确格式化代码,并复制/粘贴准确代码:Func 应为@987654323 @、var array : Uint8 应该是 var array : [UInt8] 等等。

标签: swift unsafe-pointers


【解决方案1】:

使用.withUnsafeBufferPointer 获取数组的数据,并使用&amp; 将结构传递给您的senddata 函数:

func senddata(_ req: UnsafeMutablePointer<Astruct>) -> OSStatus? {
    // ...
}

struct Astruct {
  let data: UnsafePointer<UInt8>
  let bytestosend: UInt32
  let destination: destination
}

var array: [UInt8] = [ 0xf0, 0xf7, 0x03, 0x01 ]

array.withUnsafeBufferPointer { ptr in
    guard let data = ptr.baseAddress else {
        return
    }
    var st = Astruct(data: data, bytestosend: UInt32(array.count), destination: dest)
    senddata(&st)
}

【讨论】:

  • 最好使用withUnsafeBufferPointer,这样就不需要重新绑定了。
  • 最后一点:如果缓冲区不为空,baseAddress != nil保证
  • 谢谢您的回答,但我收到此错误:线程 10:EXC_BAD_ACCESS (code=2, address=0x280a54500)
  • 我需要解除分配吗?那么 senddata 函数呢? req 参数的类型是 UnsafeMutablePointer ??我也需要为此做同样的事情吗?
  • 这是我想使用此代码的地方:stackoverflow.com/questions/57950463/…
猜你喜欢
  • 2023-01-08
  • 1970-01-01
  • 2017-04-25
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多