Go切片同时在Go中分配,并且数据结构与C数组不同,因此您无法将其传递给C函数(cgo还会阻止您执行此操作,因为切片包含Go指针)
您需要在C中分配数组才能操作C中的数组。就像使用C.CString一样,您还需要跟踪释放外部数组的位置,尤其是在C函数可能分配新数组的情况下。
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 index it
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)))