ホームページ > バックエンド開発 > Golang > ポインタを文字列配列へのポインタに変更する C 関数に Go スライスを渡すにはどうすればよいですか?

ポインタを文字列配列へのポインタに変更する C 関数に Go スライスを渡すにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-07 15:05:13
オリジナル
495 人が閲覧しました

How to Pass a Go Slice to a C Function that Modifies a Pointer to a Pointer to an Array of Strings?

Go でスライスへのポインタを C 関数に渡す

問題

オブジェクトへのポインタを期待する C 関数を呼び出すとき文字列の配列、C 関数で文字列を変更できるようにしながら、Go でこれを実現するにはどうすればよいですかarray?

解決策

Go でスライスを作成し、それを C 関数に直接渡すことは、データ構造とメモリ割り当ての違いにより不可能です。代わりに、C で配列を割り当てる必要があります。

// Allocate an array in C
cArray := C.malloc(C.size_t(c_count) * C.size_t(unsafe.Sizeof(uintptr(0))))

// Convert C array to Go array
a := (*[1<<30 - 1]*C.char)(cArray)

// Copy Go strings to C array
for index, value := range strs {
    a[index] = C.CString(value)
}

// Call C function with pointer to array pointer
err := C.f(&c_count, (***C.char)(unsafe.Pointer(&cArray)))
ログイン後にコピー

C で配列を割り当てることにより、C 関数で配列を変更したりサイズ変更したりできるようになります。 C で行われた変更は、C 関数が返された後に Go スライスに反映されます。

以上がポインタを文字列配列へのポインタに変更する C 関数に Go スライスを渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート