使用CGo调用带有双指针输出参数的C函数

Mihai Todor:

我试图找出正确的方法来调用此函数

size_t
fz_buffer_storage(fz_context *ctx, fz_buffer *buf, unsigned char **datap)
{
    if (datap)
        *datap = (buf ? buf->data : NULL);
    return (buf ? buf->len : 0);
}

使用CGo在Go中以字节数组的形式获取基础字符串及其长度。

这是正确的方法吗?

var bufferContents *C.uchar
length := C.fz_buffer_storage(ctx, buf, &bufferContents)
bytes := C.GoBytes(unsafe.Pointer(bufferContents), C.int(length))

由于C代码会覆盖*datap,所以我不确定垃圾收集器是否还会做正确的事情。

我在这里看到一个答案暗示着一些类似的东西

var tempUcharPtr *C.uchar
bufferContents := C.malloc(C.size_t(unsafe.Sizeof(tempUcharPtr)))
defer C.free(bufferContents)
length := C.fz_buffer_storage(ctx, buf, (**C.uchar)(bufferContents))
bytes := C.GoBytes(unsafe.Pointer(*(**C.uchar)(bufferContents)), C.int(length))

似乎也可以使用,但是更加复杂,我想知道它是否比以前的版本更好/更安全。

Mihai Todor:

显然,第一个版本很好。引用文档

如果Go代码所指向的Go存储器不包含任何Go指针,则Go代码可以将Go指针传递给C。

据我了解,由于var bufferContents *C.uchar将初始化为nil,因此对于上述规则,它不算作“ Go指针”。以下简化的代码示例确认了这一点:

package main

// void F(char **p) {}
import "C"

func main() {
    var p *C.char = new(C.char)
    C.F(&p)
}

将触发“紧急情况:运行时错误:cgo参数具有指向Go指针的Go指针”

package main

// void F(char **p) {}
import "C"

func main() {
    var p *C.char
    C.F(&p)
}

即使设置,也可以正常工作GODEBUG=cgocheck=2

感谢Gophers Slack社区#cgo频道上的人们帮助我理解了这一点!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么CGO无法在C中直接调用函数指针?

从C调用带有字符串参数的Go函数?

CGO;C函数具有int指针参数,如何传递正确的类型?

在Python中使用字典调用带有参数的函数

C ++中带有指针参数的函数

C ++外部函数,带有指向函数作为参数的指针,在带有成员函数的类内部使用

使用带有常量双指针

带有任意数量变量的C ++调用函数指针

使用multidplyr在dplyr :: do中调用带有参数的函数

您可以在C中使用带有已分配参数值的函数指针吗?

如何从C#使用结构指针参数调用C ++函数?

使用C ++从.dll调用带有默认参数的函数

调用带有非常量指针参数const_cast,reinterpret_cast,洗钱的c函数的正确方法

双指针作为函数参数

使用选择器调用带有参数的函数

如何在Swift中调用带有函数指针参数的函数?

如何在c中使用带有参数的函数指针?

如何接受带有任意数量参数的函数的指针(作为C中的参数)并调用它?

如何使用ctypes调用带有双下划线函数名称的DLL函数?

使用带有char指针的函数调用pthread_create

带有参数的调用函数

使用PyObject_CallMethod调用带有可选参数的函数

带有对象指针作为参数的C ++复制构造函数

如何使用JNI从JAVA调用C ++中带有参数的函数?

使用带有参数/ AJAX的按钮onClick调用PHP函数?

双指针作为函数的参数

C++ 从带有指针数组的函数内部调用函数

C:带有空指针的可变参数函数

当具有带有模板参数的函数指针作为模板参数时,“没有匹配的函数调用”