【发布时间】:2017-06-28 19:38:43
【问题描述】:
背景:使用 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 中使用它。
如何做到这一点?我已经搜索和试验了一段时间,但没有运气。
【问题讨论】:
-
您确定在主程序中分配的内存可以在C函数中重新分配吗?这可能是内存管理的差异
-
让函数返回一个
char**,而不是诉诸三星级编程。该函数的返回码目前没有任何意义。 -
@VolAnd 当前工作部分(
char**)是正确的。但是,我不确定要为我的目标做什么 (char***)。 -
@Lundin 这只是一个示例......不是我的实际代码所做的