将切片指针传递给 Go 中的 C 函数
当使用 cgo 从 Go 调用 C 函数时,将指针传递给切片。考虑一个 C 函数,如:
int f(int *count, char ***strs);
其中 count 是 strs 数组的长度,strs 是字符串数组,返回值指示错误状态。
在 Go 中,一开始可能会尝试按如下方式传递 count 和 strs:
C.f((*C.int)(&count), (**C.char)(&strs[0]))
但是,这不允许在 C 中修改 strs。要启用此功能,有必要在 C 中分配数组。与 C.CString 类似,必须跟踪释放外部数组的位置,特别是当 C 函数可能分配新数组时。
下面的代码演示了如何分配 C 数组:
cArray := C.malloc(C.size_t(c_count) * C.size_t(unsafe.Sizeof(uintptr(0)))) // Convert the C array to a Go array for 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)))
在此代码中,cArray 在 C 中分配,a 是该数组的切片包装器以允许索引,每个字符串都复制到 C 中 记忆。函数 f 现在可以修改 C 中的 strs 并将修改后的值返回给 Go。
以上是如何将 Go 切片传递给 C 函数并处理指针修改?的详细内容。更多信息请关注PHP中文网其他相关文章!