Cómo pasar puntero a cortar a la función C en ir

Antecedentes: usando cgo para llamar a las funciones C desde Golang.

Quiero usar una función C que tenga esta firma: int f(int *count, char ***strs) . Modificará los datos de count y strs , razón por la cual utiliza el puntero a ellos. El valor de count es la longitud de strs ; strs es una matriz de cadena; el valor de retorno es simplemente un indicador (booleano) que indica si hay un error o no.

En Golang, puedo pasar y modificar el count con éxito usando Cf((*C.int)(&count)) ; pase la []string usando []*C.char . El código de muestra es así:

 /* #include  int f(int *c, char **str) { int i; printf("%d\n", *c); for (i = 0; i < *c; i++) { printf("%s\n", str[i]); } *c = (*c) + 1; return 1; } */ import "C" func go_f(strs []string) int { count := len(strs) c_count := C.int(count) c_strs := make([]*C.char, count) for index, value := range strs { c_strs[index] = C.CString(value) defer C.free(unsafe.Pointer(c_strs[index])) } err := Cf(&c_argc, (**C.char)(&c_argv[0])) return int(err) } 

Como puede ver, la función C es actualmente int f(int *c, char **str) , pero lo que me gustaría es int f(int *c, char ***str) .

Es decir: lo que realmente quiero es habilitar la modificación de la matriz de cadenas (por ejemplo, cambiar el tamaño) en C y volver a convertirla en un segmento de cadena Ir, así que todavía puedo usarla en Ir.

¿Como hacer esto? He buscado y experimentado por un tiempo pero sin suerte.

Un segmento Go se asigna tanto en Go como en una estructura de datos diferente a una matriz C, por lo que no puede pasarlo a una función C (cgo también evitará que lo haga porque un sector contiene un puntero Go)

Debe asignar la matriz en C para poder manipular la matriz en C. Al igual que con C.CString, también deberá realizar un seguimiento de dónde liberar la matriz externa, especialmente si la función C puede asignar una nueva matriz.

 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 := Cf(&c_count, (***C.char)(unsafe.Pointer(&cArray)))