2 回答
TA贡献1864条经验 获得超2个赞
这必须手动完成。您必须分配一个新的**C.char类型并遍历[][]byte切片中的每个元素,以将其分配给新列表。这涉及将**C.char指针偏移每次迭代的正确大小。
这是一个执行此操作的示例程序。
正如下面的评论所建议的,如果您打算char *使用类似printfC 中的内容打印列表,请确保输入字符串以 NULL 结尾。理想情况下,通过使用C.CString()函数进行转换。但这假定它们将被视为字符串。否则,您可能还需要提供一种将每个单独char *列表的长度传递给C函数的方法。
package main
/*
#include <stdlib.h>
#include <stdio.h>
void test(char **list, size_t len)
{
size_t i;
for (i = 0; i < len; i++) {
//printf("%ld: %s\n", i, list[i]);
}
}
*/
import "C"
import "unsafe"
func main() {
list := [][]byte{
[]byte("foo"),
[]byte("bar"),
[]byte("baz"),
}
test(list)
}
func test(list [][]byte) {
// Determine the size of a pointer on the current system.
var b *C.char
ptrSize := unsafe.Sizeof(b)
// Allocate the char** list.
ptr := C.malloc(C.size_t(len(list)) * C.size_t(ptrSize))
defer C.free(ptr)
// Assign each byte slice to its appropriate offset.
for i := 0; i < len(list); i++ {
element := (**C.char)(unsafe.Pointer(uintptr(ptr) + uintptr(i)*ptrSize))
*element = (*C.char)(unsafe.Pointer(&list[i][0]))
}
// Call our C function.
C.test((**C.char)(ptr), C.size_t(len(list)))
}
输出如下:
$ go run charlist.go
0: foo
1: bar
2: baz
- 2 回答
- 0 关注
- 692 浏览
添加回答
举报