登录
首页 >  Golang >  Go问答

如何在go中将指向切片的指针传递给C函数

来源:Golang技术栈

时间:2023-04-11 09:20:03 485浏览 收藏

从现在开始,努力学习吧!本文《如何在go中将指向切片的指针传递给C函数》主要讲解了golang等等相关知识点,我会在golang学习网中持续更新相关的系列文章,欢迎大家关注并积极留言建议。下面就先一起来看一下本篇正文内容吧,希望能帮到你!

问题内容

背景:使用 cgo 从 Golang 调用 C 函数。

我想使用具有此签名的 C 函数:int f(int *count, char ***strs). 它将修改 and 的数据countstrs这就是它使用指向它们的指针的原因。的值count是 的长度strsstrs是一个字符串数组;返回值只是一个(布尔)指示符,用于说明是否存在错误。

在golang中,我可以count通过使用成功传递和修改C.f((*C.int)(&count));通过[]string使用[]*C.char. 示例代码是这样的:

/*
#include 
int f(int *c, char **str) {
    int i;
    printf("%d\n", *c);
    for (i = 0; i 

如您所见,C 函数当前是int f(int *c, char **str),但我想要的是int f(int *c, char ***str).

这就是说:我真正想要的是在 C 中启用对字符串数组的修改(例如调整大小)并将其转回 Go 字符串切片,以便我仍然可以在 Go 中使用它。

这个怎么做?我已经搜索和试验了一段时间,但没有运气。

正确答案

Go 切片在 Go 中分配,并且数据结构与 C 数组不同,因此您不能将其传递给 C 函数(cgo 也会阻止您这样做,因为切片包含 Go 指针)

您需要在 C 中分配数组以便在 C 中操作数组。就像使用 C.CString 一样,您还需要跟踪释放外部数组的位置,尤其是在 C 函数可能分配新数组的情况下。

cArray := C.malloc(C.size_t(c_count) * C.size_t(unsafe.Sizeof(uintptr(0))))

// convert the C array to a Go Array so we can index it
a := (*[1

文中关于golang的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《如何在go中将指向切片的指针传递给C函数》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>