当使用 cgo 从 Go 调用 C 函数时,通常需要将指向 Go 切片的指针作为参数传递。然而,这可能具有挑战性,因为 Go 切片不直接与 C 数组兼容。
要解决此问题,需要在 C 内存中分配数组并将指向该数组的指针传递给 C 函数。这确保了 C 函数可以修改数组并将其返回给 Go。
下面是一个示例,演示如何在 C 中分配数组并从 Go 切片传递指向它的指针:
// C function signature: int f(int *count, char ***strs) import "C" func go_f(strs []string) int { count := len(strs) c_count := C.int(count) // Allocate an array in C memory to store the strings cArray := C.malloc(C.size_t(c_count) * C.size_t(unsafe.Sizeof(uintptr(0)))) // Convert the C array to a Go array so we can access its elements a := (*[1<<30 - 1]*C.char)(cArray) // Copy the Go strings into the C array for index, value := range strs { a[index] = C.CString(value) } // Call the C function with a pointer to the C array err := C.f(&c_count, (***C.char)(unsafe.Pointer(&cArray))) // Free the C array C.free(cArray) return int(err) }
通过在 C 内存中分配数组,C 函数可以修改其内容,并且当 C 函数返回时,更改将传播回 Go 切片。
以上是如何将 Go 切片指针传递给 C 函数?的详细内容。更多信息请关注PHP中文网其他相关文章!