2

引数で何かを行うGo関数が渡されたとします。たとえば、C部分に割り当てられたバッファを埋め、それを変更し、たとえば、読み取りデータのサイズである整数引数を変更できます。 . 整数ではうまく機能しますが、「データ部分」では機能しません。コードを見てください。

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()
}

その結果、次のようになりました。

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

ご覧のとおり、整数ポインターではうまく機能しますが、uint8_t では機能しません。

4

1 に答える 1