gpt4 book ai didi

go - 通过从 C 调用的 go 函数的参数返回值

转载 作者:IT王子 更新时间:2023-10-29 01:40:00 26 4
gpt4 key购买 nike

假设,我们有一个 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。

最佳答案

您正在将 some 中的 i 重新分配给另一个地址,而不是更改给定地址的值(除非我误解了您的尝试)完成)

*i = *(*C.uint8_t)(unsafe.Pointer(&p[0]))

关于go - 通过从 C 调用的 go 函数的参数返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23658547/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com