On Wed, Aug 31, 2016 at 12:47 PM, Luke Mauldin <lukemaul...@gmail.com> wrote:
>
> I have questions about pointer arithmetic illustrated by this Play example:
> https://play.golang.org/p/-cZteTY_M2
>
> Questions:
> 1) Is this the best way to do pointer arithmetic in Go to process a C array
> and convert it to a Go slice?
> 2) Go vet gives an error on line 18 but doesn't give much information on how
> to fix the usage of unsafe.Pointer.  Any recommendations?

It's usually simplest to write an expression like
    s := (*[1 << 20]Tag)(Carr)[:arrLength:arrLength]
That will give you a slice whose backing array is the C array, without
requiring any copying.  Of course you then have to make sure that C
array lives on the heap as least as long as the slice does.  If that
is an issue, then write
    s2 := make([]Tag, arrLength)
    copy(s2, s)
To be clear, this assume there are fewer than 1 << 20 entries in the
array, so adjust as needed.


The vet errors for your code are false positives, assuming that cArr
is allocated in C memory.  That said, it's easy to avoid them by
writing code like

    q := unsafe.Pointer(cArr)
    for i := 0; i < arrLength; i++ {
        p := (*Tag)(q)
        ret = append(ret, int(*p))
        q = unsafe.Pointer(uintptr(q) + unsafe.Sizeof(q))
    }

The point is: always keep pointers as pointers, except in expressions
that convert to uintptr and back in a single expression.

Ian

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to