Swift数组元素内存地址顺序、偏移不符合预期问题咨询
核心问题
你对withUnsafePointer(to:)的使用方法错误,拿到的不是数组元素的真实存储地址,才会出现不符合预期的结果。
错误点拆解
- 当你调用
withUnsafePointer(to: array[index])时,下标访问会把对应元素的值拷贝到临时变量中,你拿到的指针是临时变量在栈上的地址,和数组在堆上的连续存储空间没有任何关系。栈本身是从高地址向低地址分配空间,所以先创建的第0个元素临时变量地址高于后创建的第1个元素临时变量地址属于正常现象,偏移量由栈对齐规则决定,和元素实际占用内存大小无关。 - 当你调用
withUnsafePointer(to: numArray)时,拿到的是数组结构体本身在栈上的地址,不是元素存储缓冲区的地址。Swift中Array是值类型,结构体内部只存储了指向堆元素缓冲区的引用、数组长度、容量三个字段,对数组结构体的指针做偏移,步长是整个Array结构体的大小,自然和Float占4字节的规则无关。
正确获取数组元素地址的方法
要获取数组连续存储的元素地址,需要使用withUnsafeBufferPointer方法,示例代码如下:
let floatArray: [Float] = [1.1, 2.2, 3.3, 4.4] floatArray.withUnsafeBufferPointer { buffer in guard let baseAddress = buffer.baseAddress else { return } print("第0个元素地址:", baseAddress) print("第1个元素地址:", baseAddress + 1) // 两者偏移量为1,对应内存差4字节,符合Float的内存大小 }
用这个方法拿到的才是数组在堆上的连续存储空间地址,偏移量和元素顺序都符合常规数组存储的认知。
内容的提问来源于stack exchange,提问作者MatthewScarpino
相关产品推荐
相关产品推荐

