在 Go 中将切片指针传递给 C 函数
在 Go 中,与 C 函数交互时的一个常见任务是传递复数数据结构,例如切片。然而,Go 切片和 C 数组有根本的区别,需要特殊处理。
考虑以下具有签名 int f(int *count, char ***strs) 的 C 函数。它需要两个指针:count 指向字符串数组的长度,strs 指向字符串指针数组。
在 Go 中,我们不能直接将切片传递给这样的函数,因为切片是Go 特定的数据结构,与 C 数组不同。此外,Go 切片包含一个 Go 指针,cgo 禁止将其传递给 C 函数。
为了克服这个问题,我们需要手动分配 C 中的数组,并跟踪释放外部数组的位置 。对于 Go 切片中的每个字符串,我们使用 C.CString 将其转换为 C 字符串,并在分配的 C 数组中记录相应的 C 字符串指针。
这是 Go 代码的修改版本:
cArray := C.malloc(C.size_t(c_count) * C.size_t(unsafe.Sizeof(uintptr(0)))) // Convert the C array to a Go Array for easy indexing a := (*[1<<30 - 1]*C.char)(cArray) for index, value := range strs { a[index] = C.CString(value) } err := C.f(&c_count, (***C.char)(unsafe.Pointer(&cArray)))
这种方法确保 C 函数可以访问可操作的 C数组,同时允许我们将操作后的数组转换回 Go 切片以供进一步使用。
以上是如何将 Go 切片传递给需要指向 C 字符串数组的指针的 C 函数?的详细内容。更多信息请关注PHP中文网其他相关文章!