我在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)
}
通过process
调用导致EXC_BREAKPOINT崩溃。
然后我尝试直接分配缓冲区:
let a = UnsafeMutablePointer<Int64>.allocate(capacity: 5)
process(a, 5*8)
a.deallocate(capacity: 5)
表现得更陌生-从未调用deallocate,而我仅遇到内存泄漏。
如何正确传递数组?
UPD: 第二种方法仅在我调用内部代码时才描述该问题:
DispatchQueue.global(qos: .background).async { .... }
当它在主线程上时,它可以工作,但是不幸的是,我需要在后台调用它。
答案 0 :(得分:1)
如果您要使用不安全的可变缓冲区指针,则可以使用withUnsafeMutableBufferPointer
而不是withUnsafeBufferPointer
进行强制转换。
但这不是必须的。您可以只做process(&a, 5 * 8)
。 Swift为您照顾了C的互操作性。
var a = [Int64](repeating: -1, count: 5)
process(&a, Int32(a.count * MemoryLayout<Int64>.stride))