假设我们有一个Go函数,它正在使用agruments做一些事情,传递给它们,例如它可以填充缓冲区,在C部分中分配并更改它,例如一个整数参数,它是读取数据的大小。它适用于整数1,但不适用于"数据部分"。只需查看代码即可。
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。
答案 0 :(得分:3)
您正在i
内将some
重新分配到另一个地址,而不是更改指定地址的值(除非我误解了您要完成的内容)
*i = *(*C.uint8_t)(unsafe.Pointer(&p[0]))