如何使用memcpy带偏移量复制Swift数组的中间部分?
Swift中使用memcpy批量复制数组中间部分的正确方式
你遇到的问题根源在于:Swift里直接通过&source[2]传递的是单个元素的内存地址,而非数组起始地址偏移后的连续内存指针。memcpy会把这个地址当成起始点,读取对应长度的字节——因为UInt8占1字节,所以只复制了1个元素。
要正确实现数组中间部分的批量复制,需要通过withUnsafeBytes安全获取源数组的底层内存缓冲区指针,再手动计算偏移量:
var source: [UInt8] = [1,2,3,4,5,6,7,8,9] var dest: [UInt8] = [0,0,0,0,0,0,0,0,0] source.withUnsafeBytes { sourceBuffer in dest.withUnsafeMutableBytes { destBuffer in // 确保缓冲区存在有效地址 guard let sourceBase = sourceBuffer.baseAddress, let destBase = destBuffer.baseAddress else { return } // 源数组偏移2个元素,目标数组偏移2个元素,复制5个元素 memcpy(destBase + 2, sourceBase + 2, 5) } } print(dest) // 输出 [0, 0, 3, 4, 5, 6, 7, 0, 0]
注意事项:
- 对于非
UInt8的数组(比如Int),不能直接用元素个数作为指针偏移量,需要结合类型的内存布局计算:偏移元素数 * MemoryLayout<Element>.stride,比如sourceBase + 2 * MemoryLayout<Int>.stride - 务必保证偏移量和复制长度不会超出数组的边界,否则会触发内存越界错误
withUnsafeBytes/withUnsafeMutableBytes是Swift提供的安全访问底层内存的方式,避免了直接操作裸指针的风险,同时能保证内存访问的正确性
内容的提问来源于stack exchange,提问作者Son Nguyen
相关产品推荐
相关产品推荐

