将Go []string转换为C char**。

7
我开始尝试使用cgo将一些C库集成到我的Go项目中,并遇到了一个问题。在C函数中,我需要将argv传递给一个函数调用。在C中,argv是指向char字符串数组的指针(K&R C, §5.10),我需要将其从字符串切片转换为char**。
我已经仔细查找了有关如何从Go转换为C的变量类型转换的任何信息,但似乎几乎没有文档。任何帮助都将不胜感激。

你看过这个了吗? - user529758
嗨,我之前没有看到这个,所以谢谢你。我读了之后对类型转换有了更深的理解。不过它似乎需要一些修改才能正常工作,特别是在没有使用 argv 时手动调用 C.freeCharArray,而不是推迟它。 - onmylemon
1个回答

8

您需要自己创建数组。可以像这样创建:

argv := make([]*C.char, len(args))
for i, s := range args {
    cs := C.CString(s)
    defer C.free(unsafe.Pointer(cs))
    argv[i] = cs
}
C.foo(&argv[0])

谢谢回答。我已经将其封装在一个函数中,但似乎出现了一些问题。第一行会产生一个错误“gm.go:73:25: 预期操作数,找到']'”,而当我们删除它时,会遇到进一步的问题,因为您不能创建_Ctype_char,并且似乎您也不能引用_Ctype_char的索引。 - onmylemon
抱歉,我今天一直在忙于C++,在语法上犯了一个错误——这次修改应该可以解决问题。如果您想将其放入辅助函数中,则可能需要稍微调整一下代码:如果defer调用在您进行C调用之前触发,那么您将会传递已释放的内存。 - James Henstridge
没关系,我继续在Go中使用PHP函数名称!这似乎解决了问题,并且我已经将其转换为帮助函数,主函数使用延迟清理事物。 - onmylemon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接