如何从字符数组中获取 UnsafeMutableBufferPointer<Character>
How to get an UnsafeMutableBufferPointer<Character> from array of Character
我正在尝试使用以下代码获取 UnsafeMutableBufferPointer,它有时在 Playground 中有效,但也失败了
let array : [Character] = ....
func getUnsafeMP(array: [Character]) -> UnsafeMutableBufferPointer<Character> {
let count = array.count
let memory = UnsafeMutablePointer<Character>(allocatingCapacity: count)
for (index , value) in array.enumerated() {
memory[index] = value //it fails here EXC_BAD_ACCESS
}
let buffer = UnsafeMutableBufferPointer(start: memory, count: count)
return buffer
}
UnsafeMutablePointer
寻址的内存可以在其中之一
三个州:
/// - Memory is not allocated (for example, pointer is null, or memory has
/// been deallocated previously).
///
/// - Memory is allocated, but value has not been initialized.
///
/// - Memory is allocated and value is initialised.
来电
let memory = UnsafeMutablePointer<Character>(allocatingCapacity: count)
分配内存,但不初始化它:
/// Allocate and point at uninitialized aligned memory for `count`
/// instances of `Pointee`.
///
/// - Postcondition: The pointee is allocated, but not initialized.
public init(allocatingCapacity count: Int)
另一方面,下标方法需要初始化指针:
/// Access the pointee at `self + i`.
///
/// - Precondition: the pointee at `self + i` is initialized.
public subscript(i: Int) -> Pointee { get nonmutating set }
因此,您的代码在 _swift_release_
内崩溃。
要从(字符)数组初始化分配的内存,
你可以使用
memory.initializeFrom(array)
当然你最终必须去初始化和释放内存。
另一种方法是
var cArray: [Character] = ["A", "B", "C"]
cArray.withUnsafeMutableBufferPointer { bufPtr in
// ...
}
这里没有分配新的内存,但是调用了闭包
指向数组连续存储的指针。这个缓冲区指针
仅在闭包内有效。
您可能正在寻找 Array 的 withUnsafeBufferPointer
方法。这使您可以直接访问阵列的连续内存存储。你可能想从这样的事情开始:
let arr = Array("hello there".characters)
arr.withUnsafeBufferPointer { p -> Void in
var i = 0
repeat {
print("character:", p[i])
i += 1
} while i < p.count
}
我正在尝试使用以下代码获取 UnsafeMutableBufferPointer,它有时在 Playground 中有效,但也失败了
let array : [Character] = ....
func getUnsafeMP(array: [Character]) -> UnsafeMutableBufferPointer<Character> {
let count = array.count
let memory = UnsafeMutablePointer<Character>(allocatingCapacity: count)
for (index , value) in array.enumerated() {
memory[index] = value //it fails here EXC_BAD_ACCESS
}
let buffer = UnsafeMutableBufferPointer(start: memory, count: count)
return buffer
}
UnsafeMutablePointer
寻址的内存可以在其中之一
三个州:
/// - Memory is not allocated (for example, pointer is null, or memory has
/// been deallocated previously).
///
/// - Memory is allocated, but value has not been initialized.
///
/// - Memory is allocated and value is initialised.
来电
let memory = UnsafeMutablePointer<Character>(allocatingCapacity: count)
分配内存,但不初始化它:
/// Allocate and point at uninitialized aligned memory for `count`
/// instances of `Pointee`.
///
/// - Postcondition: The pointee is allocated, but not initialized.
public init(allocatingCapacity count: Int)
另一方面,下标方法需要初始化指针:
/// Access the pointee at `self + i`.
///
/// - Precondition: the pointee at `self + i` is initialized.
public subscript(i: Int) -> Pointee { get nonmutating set }
因此,您的代码在 _swift_release_
内崩溃。
要从(字符)数组初始化分配的内存, 你可以使用
memory.initializeFrom(array)
当然你最终必须去初始化和释放内存。
另一种方法是
var cArray: [Character] = ["A", "B", "C"]
cArray.withUnsafeMutableBufferPointer { bufPtr in
// ...
}
这里没有分配新的内存,但是调用了闭包 指向数组连续存储的指针。这个缓冲区指针 仅在闭包内有效。
您可能正在寻找 Array 的 withUnsafeBufferPointer
方法。这使您可以直接访问阵列的连续内存存储。你可能想从这样的事情开始:
let arr = Array("hello there".characters)
arr.withUnsafeBufferPointer { p -> Void in
var i = 0
repeat {
print("character:", p[i])
i += 1
} while i < p.count
}