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 中国語 Web サイトの他の関連記事を参照してください。