swift4 - 将 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 { .... }
当它在主线程上时它可以工作,但不幸的是我需要在后台调用它......
解决方案
如果你想要一个不安全的可变缓冲区指针,你会使用withUnsafeMutableBufferPointer
而不是withUnsafeBufferPointer
使用强制转换。
但这都是不必要的。你可以这样做process(&a, 5 * 8)
。Swift 为您处理 C 互操作性。
var a = [Int64](repeating: -1, count: 5)
process(&a, Int32(a.count * MemoryLayout<Int64>.stride))
请参阅与 C 指针交互。
推荐阅读
- windows - 是否可以确定 IE 是否从 C# 或 powershell 代码重新下载 Silverlight xaps?
- wordpress - 从 wordpress url 中删除自定义帖子类型 slug 并保留分类术语
- r - 在 R 中加载多个 SQL 表
- php - Laravel 将 CSV 数据解析为数组/对象:添加了重复/不正确的记录
- perl - 使用字符串访问多维哈希
- docker - Docker 远程卷和远程机器性能
- jquery - 为什么我的 jQuery Ajax 请求不起作用
- angular - 我无法使用 Syncfusion 饼图复制角度组件,它会损坏
- sql - 在 Spring Boot 应用程序中使用 Elasticsearch 全文搜索 sql 数据库的正确方法
- ios - 如何为某些用户修复 Testflight “没有可用的构建”