背景:使用cgo从Golang调用C函数。
我想使用具有以下签名的C函数:int f(int *count, char ***strs)
。
它将修改count
和strs
的数据,这就是为什么它使用指向它们的指针的原因。
count
的值是strs
的长度;strs
是一个字符串数组;返回值只是一个(布尔)指示器,说明是否存在错误。
在Golang中,我可以通过使用C.f((*C.int)(&count))
成功地传递和修改count
;通过使用[]*C.char
传递[]string
。示例代码如下:
/*
#include <stdio.h>
int f(int *c, char **str) {
int i;
printf("%d\n", *c);
for (i = 0; i < *c; i++) {
printf("%s\n", str[i]);
}
*c = (*c) + 1;
return 1;
}
*/
import "C"
func go_f(strs []string) int {
count := len(strs)
c_count := C.int(count)
c_strs := make([]*C.char, count)
for index, value := range strs {
c_strs[index] = C.CString(value)
defer C.free(unsafe.Pointer(c_strs[index]))
}
err := C.f(&c_argc, (**C.char)(&c_argv[0]))
return int(err)
}
如您所见,目前的C函数为
int f(int *c, char **str)
,但我想要的是int f(int *c, char ***str)
。也就是说:我实际上想要在C中启用对字符串数组的修改(例如调整大小),并将其转换回Go字符串切片,以便我仍然可以在Go中使用它。
如何做到这一点?我已经搜索和尝试了一段时间,但没有成功。
char**
。目前函数的返回代码没有任何有意义的作用。 - Lundinchar**
的工作部分是正确的。然而,我不确定如何处理我的目标 (char***
)。 - renyuneyun