gpt4 book ai didi

go - 如何将指针的地址传递给C函数

转载 作者:数据小太阳 更新时间:2023-10-29 03:18:39 24 4
gpt4 key购买 nike

我正在尝试与一个C库接口,该库使用错误代码的返回值,并接受指向它为句柄设置的指针的指针,在C代码中,我将编写:

handle_t *h;
int error = int create_handle(&h);
float result = do_something(h, 1, 2, 3);

handle_t主要是不透明的,但有时是从直接获取状态信息的小结构,有时是从指针本身获取状态信息。
我如何编写go代码来调用它?所有使用unsafe.pointer和使用c.ulong技巧(为指针创建指向的空间)的尝试都没有成功。另外,如何将此指针保存在结构中?这是我最大的努力,我真的想不出来。我不太明白go可以做什么,不能做什么,以及它对通过ffi边界的w.r.t c指针有什么作用。
type Data struct {
ptr unsafe.Pointer
}

func NewData() *Data {
handle := unsafe.Pointer{0}
err := C.create_handle(&handle)
result := C.do_something(handle, 1, 2, 3)
save := new(Data)
save.ptr = handle
return save
}


此库的接口超出我的控制,无法更改。

最佳答案

我认为handle_tvoid *的typedef。您可以尝试以下代码:

package main

/*
#include <stdio.h>
#include <stdlib.h>

typedef void* handle_t;

int create_handle(handle_t *h) {
char *p = (char*)calloc(sizeof(char), 3);
p[0] = 'a';
p[1] = 'b';
*h = p;
return 1;
}

int do_something(handle_t h, int i, int j, int k) {
char *p = (char*)h;
printf("%s\t%d\n", p, i);
return 1;
}
*/
import "C"

import "unsafe"

type Data struct {
ptr C.handle_t
}

func NewData() *Data {
var handle C.handle_t = nil
C.create_handle(&handle)
C.do_something(handle, C.int(1), C.int(2), C.int(3))
return &Data{handle}
}

func main() {
data := NewData()
C.free(unsafe.Pointer(data.ptr))
}

关于go - 如何将指针的地址传递给C函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57265162/

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