首页 > 解决方案 > 将 Int64 的可变数组从 Swift 传递到 C

问题描述

我在 C 中有一个简单的函数来填充一个数组:

void process(long long * array, int arraySizeInBytes)

试图从 Swift 调用它,传递一个包含 5 个元素(40 个字节)的数组:

var a: [Int64]()
a.append(-1)
a.append(-1)
a.append(-1)
a.append(-1)
a.append(-1)
a.withUnsafeBufferPointer { (cArray: UnsafeBufferPointer<Int64>) -> () in
    process(cArray.baseAddress as! UnsafeMutablePointer<Int64>, 5 * Int64.bitWidth/8)
}

这会导致 EXC_BREAKPOINT 在与process调用的线路上崩溃。

然后我尝试直接分配缓冲区:

let a = UnsafeMutablePointer<Int64>.allocate(capacity: 5)
process(a, 5*8)
a.deallocate(capacity: 5)

这表现得更奇怪 - 从未调用 deallocate 并且我只是内存泄漏。

如何正确传递数组?

UPD: 第二种方法只有在我调用内部代码时才描述问题:

DispatchQueue.global(qos: .background).async { .... }

当它在主线程上时它可以工作,但不幸的是我需要在后台调用它......

标签: swift4

解决方案


如果你想要一个不安全的可变缓冲区指针,你会使用withUnsafeMutableBufferPointer而不是withUnsafeBufferPointer使用强制转换。

但这都是不必要的。你可以这样做process(&a, 5 * 8)。Swift 为您处理 C 互操作性。

var a = [Int64](repeating: -1, count: 5)
process(&a, Int32(a.count * MemoryLayout<Int64>.stride))

请参阅与 C 指针交互


推荐阅读