ホームページ >バックエンド開発 >Golang >Go スライスを C 関数に渡してポインタの変更を処理する方法は?

Go スライスを C 関数に渡してポインタの変更を処理する方法は?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-16 18:34:12958ブラウズ

How to Pass Go Slices to C Functions and Handle Pointer Modifications?

スライスへのポインタを 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。