> On Jun 9, 2016, at 8:39 PM, Saagar Jha via swift-users 
> <swift-users@swift.org> wrote:
> 
> Nevermind, I lied. Swift does allow direct pointer arithmetic:
> 
> import Foundation
> 
> var source = [UInt8](repeating: 0x1f, count: 32)
> var destination = [UInt8](repeating: 0, count: 64)
> 
> memcpy(&destination, source, 32) // the C function
> 
> memcpy(&destination + 3, source, 13) // the + operator works to offset

Arrays can indeed be used as pointer parameters, but the second one only works 
by accident. The pointer bridging has the same semantics as an 'inout' 
parameter, so the pointer is only valid for the duration of the immediate call, 
and since operators in Swift are also function calls, the pointer expires after 
the '+' operation. If you're doing anything with an array other than passing it 
off to a single C function, you should use withUnsafeMutableBufferPointer 
instead:

destination.withUnsafeMutableBufferPointer { p in
  memcpy(p.baseAddress, source, 32)
  memcpy(p.baseAddress + 3, source, 13)
}

In addition to not having undefined behavior, this will also probably be 
faster, since it'll only need to pin the array for pointer access once instead 
of twice.

-Joe
_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to