将 Int64 的可变数组从 Swift 传递给 C

Pass mutable array of Int64 from Swift to 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,我只是遇到内存泄漏。

如何正确传递数组?

更新: 第二种方法只有当我调用里面的代码时才会出现问题:

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

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

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

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

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

Interacting with C Pointers