スライスへのポインタを 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]))
ただし、これでは strs を変更することはできません。 C. これを有効にするには、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 中国語 Web サイトの他の関連記事を参照してください。