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

时间:2019-04-05 23:12:21

标签: swift4

我在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 { .... }

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

1 个答案:

答案 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))

请参见Interacting with C Pointers