Returning values through the arguments of go function, which is called from C

StackOverflow https://stackoverflow.com/questions/23658547

  •  22-07-2023
  •  | 
  •  

Pergunta

Suppose, we've got a Go function, which is doing something with agruments, passed to them, e.g. it could fill the buffer, allocated in the C part and changing it and for example an integer argument, which is a size of read data. It works well with an integer one, but not with a "data part". Just see a code.

package main

/*

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>

extern int some(uint8_t *, int *);

static int somewrap() {
    uint8_t *i = malloc(16);
    int A = 1;
    int *x = &A;

    some(i, x);

    fprintf(stderr, "c.wrapper, i=%s, %p, x=%d, %p\n", i, i, *x, x);

    return 0;
}

*/
import "C"

import "fmt"
import (
    "unsafe"
)

//export some
func some(i *C.uint8_t, x *C.int) C.int {
    fmt.Println("i:", i, &i, *i, "x:", x, &x, *x)

    p := []byte("xxx")
    i = (*C.uint8_t)(unsafe.Pointer(&p[0]))

    *x = C.int(42)

    fmt.Println("i:", i, &i, *i, "x:", x, &x, *x)
    return C.int(0)
}

func main() {
    C.somewrap()
}

As a result, we've got following:

i: 0x4303a40    0xc210000018 0   x: 0x7fff5fbff874 0xc210000020 1
i: 0xc210000038 0xc210000018 120 x: 0x7fff5fbff874 0xc210000020 42
c.wrapper, i=, 0x4303a40, x=42, 0x7fff5fbff874

As you can see, it works well for integer pointer, but not for uint8_t.

Foi útil?

Solução

You're re-assigning i within some to another address, not change the value at the given address (unless I'm misunderstanding what you're trying to accomplish)

*i = *(*C.uint8_t)(unsafe.Pointer(&p[0]))
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top