You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 02:45:22