【问题标题】:How to initialize memory at UnsafeMutableRawPointer如何在 UnsafeMutableRawPointer 初始化内存
【发布时间】:2018-10-18 17:50:08
【问题描述】:

我正在使用 UnsafeMutableRawPointer 分配内存:

let p = UnsafeMutableRawPointer.allocate(bytes: 1000, alignedTo: MemoryLayout<UInt8>.alignment)

// do stuff

p.deallocate(bytes: 1000, alignedTo: MemoryLayout<UInt8>.alignment)

分配后,我想初始化内存,即将我刚刚分配的所有 1000 个字节写入 0x00。尽管谷歌搜索,我就是不知道该怎么做。

“do stuff”是对 C 库的调用,它将一些字节写入指针; my_c_func(p)

不幸的是,C 函数希望所有字节都为 NULL。我只有一个静态库,我无法更改 C 代码。

【问题讨论】:

  • 请详细说明您要完成的工作。在 Swift 3+ 中,有许多 API 可以为您进行内存管理,例如 [UInt8](repeating: 0x0, count: 1000)
  • 我会修改问题。
  • p.initializeMemory(...) 呢?
  • 谢谢大家,让我试试。我不太了解 Swift。

标签: swift


【解决方案1】:

initializeMemory(as:from:count:)

使用从给定指针开始的值初始化此指针引用的内存,将内存绑定到值的类型,并返回一个指向已初始化内存的类型化指针。

示例(Swift 4.2):

let p = UnsafeMutableRawPointer.allocate(byteCount: 1000, alignment: MemoryLayout<UInt8>.alignment)
p.initializeMemory(as: UInt8.self, repeating: 0, count: 1000)

// Do stuff ...

p.deallocate()

initializeMemory() 方法返回一个 类型化指针,以防你 需要那个,所以你也可以写

let uint8ptr = p.initializeMemory(as: UInt8.self, repeating: 0, count: 1000)
// UnsafeMutablePointer<UInt8>

【讨论】:

  • 帮我看看,就是说“调用中的额外参数'计数'”
  • @PeterPrographo:该代码使用 Xcode 10 (Swift 4.2) 编译。你用的是哪个版本?
  • @PeterPrographo:那就是p.initializeMemory(as: UInt8.self, at: 0, count: 1000, to: 0)
猜你喜欢
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 2020-10-03
  • 2019-03-19
  • 2019-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多